字符串比较

有两种不同类型的字符串比较。

二进制字符串比较

二进制字符串比较始终使用整理顺序 *HEX ,并且将比较每个字符串的相应字节。 此外,仅当两个字符串的长度相同时,两个二进制字符串才相同。 如果字符串等于较短字符串长度的长度,那么即使较长字符串中的剩余字节是十六进制零,也会将较短字符串视为小于较长字符串。 请注意,除非将字符串强制转换为二进制字符串,否则不能将二进制字符串与字符串进行比较。

字符和图形字符串比较

当对所有 SBCS 数据和混合数据的单字节部分执行语句时,字符和 Unicode 图形字符串比较使用有效的整理顺序。 如果整理顺序为 *HEX ,那么将比较每个字符串的相应字节。 对于所有其他整理顺序,将比较每个字符串的权重值的相应字节。

如果字符串具有不同的长度,那么在比较之前将在右边用空格填充较短字符串的临时副本。 填充使每个字符串的长度相同。 无论整理顺序如何,填充字符始终为空白。 对于位数据, pad 字符也是一个空白。 对于 DBCS 图形数据,填充字符是 DBCS 空白 (x '4040')。 对于 Unicode 图形数据,填充字符为 UTF-16 空白。 1

如果下列任何一项为 true ,那么两个字符串相等:

  • 这两个字符串都为空。
  • 使用 *HEX 整理顺序,并且所有相应的字节都相等。
  • 使用除 *HEX 以外的整理顺序,并且加权值的所有相应字节都相等。

空字符串等于空字符串。 两个不相等的字符串之间的关系由来自字符串左端的第一对不相等的字节 (或加权值的字节) 的比较确定。 此比较是根据执行语句时有效的整理顺序进行的。

在将在多个环境中运行的应用程序中,必须使用相同的整理顺序 (这取决于环境的 CCSID) 来确保相同的结果。 下表显示了 EBCDIC , ASCII 和美国英语的 Db2® LUW 缺省整理顺序之间的差异,显示了根据每个排序的列表。

表 1. 正在整理序列差异
ASCII 和 Unicode EBCDIC Db2 LUW 缺省值
0000 @@@@ 0000
9999 co-op 9999
@@@@ coop @@@@
COOP piano forte co-op
PIANO-FORTE piano-forte COOP
co-op COOP coop
coop PIANO-FORTE piano forte
piano forte 0000 PIANO-FORTE
piano-forte 9999 piano-forte

如果两个长度不同的变长字符串仅在尾部空格数上存在差异,那么它们相等。 在从一组此类值中选择一个值的操作中,选择的值是任意的。 可以涉及此类任意选择的操作包括 DISTINCT , MAX , MIN , UNION , EXCEPT , INTERSECT 以及对分组列的引用。 有关对分组列的引用中涉及的任意选择的更多信息,请参阅 group-by-clause

用于比较的转换规则:

当比较两个字符串时,如果需要,首先将其中一个字符串转换为另一个字符串的编码字符集。 仅当满足以下所有条件时,才需要字符转换:

  • 这两个字符串的 CCSID 不同。
  • 两个 CCSID 都不是 65535。
  • 选择进行转换的字符串既不为 null 也不为空。
  • 需要在两个 CCSID 之间进行转换。 有关更多信息,请参阅 编码字符集和 CCSID

如果比较具有不同编码方案的两个字符串,那么任何必要的转换都将应用于字符串,如下所示:

表 2。 选择用于字符转换的结果编码方案
第一个操作数 第二个操作数
SBCS data(SBCS 数据) DBCS 数据 mixed data(混合数据) Unicode 图形数据
SBCS data(SBCS 数据) 请参阅下文
DBCS 数据 首个 请参阅下文
mixed data(混合数据) 首个 首个 请参阅下文
Unicode 图形数据 首个 首个 首个 请参阅下文

否则,为转换选择的字符串取决于每个操作数的类型。 下表显示在给定操作数类型的情况下选择了哪个操作数进行转换:

表 3. 选择 "操作数" 以进行字符转换
第一个操作数 第二个操作数
列值 派生值 专用寄存器 常量 变量
列值
派生值 首个
专用寄存器 首个 首个
常量 首个 首个 首个
变量 首个 首个 首个 首个

在任何操作中使用包含外部编码方案中的数据的变量之前,总是有效地将其转换为本机编码方案。 上述规则是基于这种转换已经发生的假设。

如果无法转换字符串的字符,或者未定义一对 CCSID 之间的转换,那么将返回错误。 有关更多信息,请参阅 编码字符集和 CCSID。 如果将字符串的字符转换为替换字符,那么会发生警告。

1 UTF-16 在代码点 X'0020 '和 X'3000' 处定义空白字符。 数据库管理器在代码点 X'0020 ' 处填充空白。