线束单元规格
通过为某些内置函数指定字符串单元,并使用CAST规范,您可以以“基于字符”的方式处理字符串数据,而不是“基于字节”的方式。 字符串单元决定操作的长度。 您可以指定 CODEUNITS32、 CODEUNITS16 或OCTETS作为操作单位。
- CODEUNITS32
- 指定Unicode UTF-32 为运算单位。 CODEUNITS32 当应用程序需要以简单的固定长度格式处理数据,且无论数据的存储格式(ASCII、EBCDIC、 或 )如何,都需要得到相同的答案时,它就派上用场了。 UTF-8 UTF-16 虽然答案是以 CODEUNITS32 的形式给出的,但数据并未转换为 UTF-32 以执行该功能。
- CODEUNITS16
- 指定Unicode UTF-16 为运算单位。 CODEUNITS16 当应用程序想知道字符串中有多少双字节字符时,它非常有用。
- OCTETS
- 指定字节为操作单位。 当应用程序需要分配缓冲区空间或操作需要使用简单的字节处理时,通常会使用八位字节。
用字符串单位( CODEUNITS16 或 CODEUNITS32 )或字节(OCTETS)来计算字符串的长度可能会得到不同的答案。 当指定了 OCTETS 时,字符串的长度可以通过简单地计算字符串中的字节数来确定。 通过 CODEUNITS16 或 CODEUNITS32 进行计算,除非数据包含补充字符,否则结果相同。 有关数据包含补充字符时 CODEUNITS16 和 CODEUNITS32 之间的差异的信息,请参阅 CODEUNITS16 和 CODEUNITS32 之间的差异。
示例 :假设 NAME 是一个 VARCHAR(128) 列,使用 Unicode 编码 UTF-8 ,其中包含值 'Jürgen'。 前两个查询分别计算 CODEUNITS32 和 CODEUNITS16 字符串的长度,返回的值相同,均为6。 第三个查询以八位字节为单位计算字符串的长度,返回值为7。 这些值是以指定的字符串单位表示的字符串长度。
SELECT CHARACTER_LENGTH(NAME,CODEUNITS32)
FROM T1 WHERE NAME = 'Jürgen'; SELECT CHARACTER_LENGTH(NAME,CODEUNITS16)
FROM T1 WHERE NAME = 'Jürgen'; SELECT CHARACTER_LENGTH(NAME,OCTETS)
FROM T1 WHERE NAME = 'Jürgen';下表显示了“Jürgen”的 UTF-8、 UTF-16 和 UTF-32 表示形式。
表格中粗体字部分显示了“Jürgen” 中ü字符在三个字符串单元中的不同表示方式:
| 格式 | “Jürgen”这个名字的写法 |
|---|---|
| UTF-8 | x'4AC3BC7267656E ' |
| UTF-16 | x'0 0 4A00FC007200670065006E' |
| UTF-32 | x'0 000004A000000FC00000072 00000067000000650000006E' |
- UTF-8 中ü字符的表示为 X'C3BC'。 在 UTF-8 中, Latin-1 子集(主要是a到z、A到Z和0到9)中不包含的字符(例如重音字符或日文字符)由多个字节表示。
- UTF-16 中ü字符的表示为 X'00FC'。 在 UTF-16 中,每个字符用两个字节表示。 UTF-16 补充字符占用两个2字节代码点。
- UTF-32 中ü字符的表示为 X'000000FC'。 在 UTF-32 中,每个字符由4个字节表示。
在内置函数中指定字符串单位不会影响函数结果的数据类型或CCSID。 如有必要,当指定了 CODEUNITS32 或 CODEUNITS16 时, Db2 会将数据转换为Unicode进行评估。 Db2 当指定了OCTETS时,总是按照输出数据的编码方案评估数据。 有关函数结果的数据类型和CCSID的更多信息,请参阅每个函数的描述。
ASCII、EBCDIC和Unicode字符表示方式的不同可能会影响查询结果。
示例 :假设 NAME 是一个 VARCHAR(128) 列,使用 EBCDIC (CCSID 37) 编码,包含值 'Mit freundlichen Grüßen, Jürgen'。 以下查询返回字符串“Mit freundlichen Grüß”:
SELECT SUBSTRING(C1,1,21,CODEUNITS16)
FROM T1 WHERE C1 = 'Mit freundlichen Grüßen, Jürgen';下表更详细地显示了结果数据:
表格中粗体字部分显示,在 UTF-8 和 UTF-16 中, 字符ü 和 ß 分别需要占用两个字节。 如果SUBSTRING函数中指定了OCTETS,以 UTF-8 字节而不是EBCDIC OCTETS或 CODEUNITS16 来计算字符串,结果将是“Mit freundlichen Grü”。 字符ß将会丢失。
| 格式 | “Mit freundlichen Grüß”的表示 |
|---|---|
| EBCDIC |
|
| UTF-8 |
|
| UTF-16 |
|