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' は、埋め込み (ブランク) 文字です。