CODEUNITS16 と CODEUNITS32 の相違

CODEUNITS16 と CODEUNITS32 は、データが補助文字を含まない場合 は、同じ応答を返します。

補助文字は、2 つの UTF-16 コード単位または 1 つの UTF-32 コード単位として表現されます。 UTF-8 では、非補助文字は 1 から 3 バイトで表現され、補助文字は 4 バイトで表現されます。 UTF-16 では、非補助文字は 1 つの CODEUNIT16 コード単位、つまり 2 バイトで表現され、補助文字は 2 つの CODEUNIT16 コード単位、つまり 4 バイトで表現されます。 UTF-32 では、文字は 1 つの CODEUNIT32 コード単位、つまり 4 バイトで表現されます。 このように、CODEUNITS16 および CODEUNITS32 は、データが補助文字を 含む場合は、異なる応答を返します。

例 1: 以下の表は、数学の太字大文字 A とラテン語の大文字 A の 16 進値を示しています。 数学で使用される太字の大文字 A は、UTF-8、UTF-16、および UTF-32の 4 バイトで表される補足文字です。
文字 UTF-8 で表現した場合 UTF-16 表記 UTF-32 表記
Unicode 値 ¥u1D400 - 「A」

数学的な太字大文字 の A

X'F09D9080' X'D835DC00' X'0001D400'
Unicode 値 ¥u0041 - 「A」

ローマ字大文字 の A

X'41' X'0041' X'00000041'
C1 は Unicode UTF-8 でエンコードされた VARCHAR(128) の列であり、表 T1 には 1 つの行が入っていて、これに数学の太字の大文字 A (X'F09D9080') の値が入っているものとします。 下記の類似の照 会は、異なる応答を戻します。
-- Query:                                               -- Returns the value:
SELECT CHARACTER_LENGTH(C1,CODEUNITS32) FROM T1;        -- 1
SELECT CHARACTER_LENGTH(C1,CODEUNITS16) FROM T1;        -- 2
SELECT CHARACTER_LENGTH(C1,OCTETS) FROM T1;             -- 4
例 2: C1 は VARCHAR(128) の列で Unicode UTF-8 でエンコードされ、表 T1 は、数学的な太字大文字 A の値 (X'F09D9080') がある 1 行を含むものと仮定します。 下記の類似の照会は、異なる応答を戻します。
-- Query:                                                -- Returns the value:
SELECT HEX(SUBSTRING(C1,1,1,CODEUNITS32)) FROM T1;      -- X'F09D9080'   
SELECT HEX(SUBSTRING(C1,1,1,CODEUNITS16)) FROM T1;      -- X'20'
SELECT HEX(SUBSTRING(C1,1,2,CODEUNITS16)) FROM T1;      -- X'F09D9080'
SELECT HEX(SUBSTRING(C1,1,1,OCTETS)) FROM T1;           -- X'20'
SELECT HEX(SUBSTR(C1,1,1)) FROM T1;                     -- X'F0'  
X'20' は、埋め込み (ブランク) 文字です。