DB2 9 中基于字符的字符串函数

简介在当今这个互联网和经济全球化时代,需要使用越来越多的应用程序处理不同国家语言表示的数据。对开发人员而言,这就意味着在应用程序开发的各个阶段 — 数据库设计、应用程序设计和应用程序编程 — 都要考虑到不同国家的语言需求。DB2 9 支持具有不同属性的各种语言,比如...显示全部

简介



在当今这个互联网和经济全球化时代,需要使用越来越多的应用程序处理不同国家语言表示的数据。对开发人员而言,这就意味着在应用程序开发的各个阶段 — 数据库设计、应用程序设计和应用程序编程 — 都要考虑到不同国家的语言需求。DB2 9 支持具有不同属性的各种语言,比如重音符号(法语)、双向(阿拉伯语)和大字符集(中文)。这些语言在存储、处理、访问和表示数据方面提出了各自不同的挑战。受国家语言影响的数据不仅限于字符串数据。还包括有数值型、日期型和货币型数据。
字符与字符串数据的字节语义之间的对比
DB2 9 以前版本中的一些字符串函数从字节和双字节单元的混合角度处理字符和图形数据。正如之前解释的那样,越来越多的用户根据不同国家语言的字符来考虑数据。DB2 9 的新功能解决了字符组成及其长度计算方面的问题,本文将讨论这些新功能。
对于单字节字符编码模式,一个字节组成一个字符,单字节字符串的长度与字符串的字节长度相同。对于图形字符串,两个字节组成一个字符,使用双字节数来表示字符串的长度。但是对于多字节编码,字符的字节长度随使用编码模式的不同而不同,每个字符的长度可能是一个字节或多个字节。本文中将使用字节计算字符串长度的方法称作字节语义,而使用字符数计算字符串长度的方法称作字符语义
考虑以下的中文字符串:
图 1. 中文字符串



如果使用字符语义计算字符串的长度,则该字符串的长度为 2。但是如果使用字节语义并使用 UTF-8 对字符进行编码,则该字符串的长度为 6 字节。
对基于字符的函数的需求
SQL 中基于字符的数据在很多上下文中都与数值有关,如下所述: 字符串变量的长度:SUBSTR 函数的输入参数,决定了结果字符串的期望长度或 LENGTH 函数的输出。字符串中的偏移量:LOCATE 函数的第二个参数,指定了字符串中开始搜索的起始位置。
这些数值表示单字节数据的字节数和图形或双字节数据的双字节数。但是对于多字节字符编码(如 UTF-8),这些数值并不符合字符语义。下面的条件可以帮助我们理解为何需要基于字符的函数。

字符的组成


将字符看作一个单元而不是一个字节序列,这是进行多字节字符的字符串操作的必要条件。应用程序开发人员需要知道,分配缓冲区时应该给每个字符分配多大内存。因此,理解字符组成对编写应用程序处理多字节字符数据非常重要。 可以将字符定义为一个信息单元,对应于书面语言的一个原子单元。每个字符由一个使用字符编码的位序列表示。单个字符通常使用一个字节或多个字节进行编码,具体情况取决于使用的编码方式。 考虑字符 “A” 和 “上面带圈的大写拉丁字母 A”。字符 “A” 的十六进制表示是 x‘41’ 而 “上面带圈的大写拉丁字母 A” 的十六进制表示是 x‘C385’。通过 SQL 函数 hex() 可以获取此表示。
图 2. 字符的十六进制表示



从上面的表示可以看到,显示期间只存在一个字符。但是,“A” 的长度是一个字节而 “上面带圈的大写拉丁字母 A” 的长度则是两个字节。收起
参与5

查看其它 3 个回答zhaodongjie的回答

zhaodongjiezhaodongjie系统工程师

DB2 9 中基于字符的字符串函数

CHARACTER_LENGTH


如 SQL 标准中所述,此函数使用字符语义查找字符字符串的长度。此函数与 DB2 中的 LENGTH 函数类似,并拥有一个可选的字符串长度单元,可以用来表示结果。与 LENGTH 函数不同,CHARACTER_LENGTH 只接受基于字符串的输入数据。该函数包含两个参数,第一个参数是字符串,而第二个参数是代码单元。在很多情形下,您需要根据代码单元计算的字符串长度,可以使用基于字符的函数来获取根据字符串单元计算的字符串长度。
考虑之前讨论的 “音符 G 音谱号” 字符例子。
清单 2. 使用 CHARACTER_LENGTH 获取基于 CODEUNITS 的字符串长度
                VALUES CHAR_LENGTH(X'F09D849E',CODEUNITS16)1          -----------          2  1 record(s) selected.VALUES CHAR_LENGTH(X'F09D849E',CODEUNITS32)1          -----------          1  1 record(s) selected.


使用基于字符的字符串函数可以解决获取基于 CODEUNITS 的字符串长度时的问题。

OCTET_LENGTH


如 SQL 标准中所述,此函数返回输入字符串的八位字节长度或字节长度。它与对单字节数据类型使用 LENGTH 函数类似。如果使用双字节数据类型作为输入,它就会给出双倍的 LENGTH 函数值。使用 CHARACTER_LENGTH 并使用 OCTETS 作为字符串长度单元时也会产生同样的功能。

清单 3. 使用 OCTECT_LENGTH 获取字符串的字节长度
                    VALUES OCTET_LENGTH(X'F09D849E')1          -----------          4  1 record(s) selected.

LOCATE


LOCATE 函数返回一个字符串在另一个字符串中第一次出现的起始位置。如果没有找到搜索字符串,并且参数都不为空,则所得的结果是零。如果找到搜索字符串,则所得结果是一个从 1 到源字符串实际长度之间的一个数字。如果指定了可选的起始位置,则表明它是源字符串中开始进行搜索的字符位置。可以指定一个可选的字符串长度单元来指明在哪些单元中表示函数的起始位置和结果。
可以使用基于字符的函数来解决在 LOCATE 函数中指定起始位置的问题,如图 7 所示:
图 7. 通过 CODEUNITS 使用 LOCATE




POSITION


POSITION 函数返回一个字符串在另一个字符串中第一次出现的起始位置。如果没有找到搜索字符串,并且参数都不为空,则所得的结果是 0。如果找到搜索字符串,则所得结果是一个从 1 到输入字符串实际长度之间的一个数字,使用显式指定的代码单元来表示。POSITION 函数是在 SQL 标准中进行定义的。它与 DB2 家族之间实现的 POSSTR 函数相似但不相同。
使用基于字符的函数可以解决将字节位置返回为字符位置的问题。图 8 展示了如何使用 LOCATE 函数来实现此目的。
图 8. 通过 CODEUNITS 使用 POSITION


SUBSTRING


SUBSTRING 函数返回字符串的子字符串。子字符串是输入字符串的零个或多个相邻字符串长度单元。除了输入字符串之外,SUBSTRING 函数还有其他三个参数,它们分别是:起始位置、长度和代码单元指定。起始位置指定了输入字符串中结果的第一个字符串长度单元所在的位置。长度参数指定了所需子字符串的长度。使用基于字符的函数时不会发生用于构建字符的 CODEUNITS 分解。图 9 展示了如何防止多字节字符的分解。
IT分销/经销 · 2011-05-16
浏览921

回答者

zhaodongjie
系统工程师
擅长领域: 数据库数据库安全安全

zhaodongjie 最近回答过的问题

回答状态

  • 发布时间:2011-05-16
  • 关注会员:1 人
  • 回答浏览:921
  • X社区推广