字符数据是根据字符值大小比较的,而字符值则根据以下两种度量进行比较:
- 二进制和语言比较
- 空白填充或非填充比较语义
二进制和语言比较
二进制比较
在默认的二进制比较中,OceanBase 根据数据库字符集中字符的数字代码的级联值比较字符串。如果一个字符在字符集中的数值大于另一个,则该字符更大。OceanBase 不支持 ASCII 字符集和 EBCDIC 字符集。
语言比较
在语言排序中,SQL 排序和比较都按照 NLS_SORT
指定的语言规则。若字符编码的二进制序列与字符集要求的语言序列不匹配,则使用语言比较。若 NLS_SORT
参数的设置不是 BINARY
,且 NLS_COMP
参数设置为 LINGUISTIC
,则使用语言比较。
空白填充和非填充比较语义
空白填充比较语义
使用空白填充语义,若两个值的长度不同,则 OceanBase 首先将空格添加到较短的空格的末尾,以便它们的长度相等。然后,OceanBase 逐个字符地比较值,直到第一个不同的字符为止。在第一个不同位置具有较大字符的值被认为较大。如果两个值没有不同的字符,则认为它们相等。此规则意味着两个值仅在尾随空白数上不同时相等。
注意:
只有当比较中的两个值都是数据类型
CHAR
、NCHAR
、文本文字或USER
函数返回的值时,OceanBase 就会使用空白填充的比较语义。
非填充比较语义
使用非填充语义,OceanBase 逐个字符地比较两个值,直到第一个不同的字符为止。该位置上具有较大字符的值被认为较大。如果两个不同长度的值在较短的值之前一直相同,则较长的值被认为较大。如果两个长度相等的值没有不同的字符,则认为这些值相等。
注意:
只要比较中的一个或两个值的数据类型为
VARCHAR2
或NVARCHAR2
,OceanBase 就会使用非填充比较语义。
示例
使用不同的比较语义比较两个字符值的结果不同。本示例显示了使用空白填充语义和非填充语义比较。
空白填充 | 非填充 |
‘ac’ > ‘ab’ | ‘ac’ > ‘ab’ |
‘ab’ > ‘a ’ | ‘ab’ > ‘a ‘ |
‘ab’ > ‘a’ | ‘ab’ > ‘a’ |
‘ab’ = ‘ab’ | ‘ab’ = ‘ab’ |
‘ac’ > ‘ab’ | ‘ac’ > ‘ab’ |
‘a ‘ = ‘a’ | ‘a ‘ > ‘a’ |
通常,空白填充和非填充比较的结果是相同的。而最后一行的比较示例说明了空白填充和非填充比较语义之间的区别。