引用似乎来自此 OCA/OCP Oracle Database 11g All-in-One Exam Guide 第 9 章的第 31 页。这似乎是不正确的(善良),因为如果它像当时那样工作abc
并且cba
确实会被视为等效。
11gR2 SQL 语言参考说:
在默认的二进制比较中,Oracle根据数据库字符集中字符的数字代码的连接值来比较字符串。如果一个字符在字符集中的数值大于另一个字符,则它大于另一个字符。
关键区别在于短语“连接值”,即更接近@JoroenMoonen 演示的内容,其中字符集中的数字代码拼凑在一起;而不是书中显示的值的总和。
但是,如果认为每个字符的数字代码被连接在一起,并且结果(可能很长!)字符串代表一个比较的数字,那将是一种误导。取这些值abc
= 000001000001000001100100
=266340
和cba
= 011001000001000000000100
= 6557700
。仅将 6557700 与 266340 进行比较确实会表明cba
'大于' abc
。但cb
也“大于” abc
- select greatest('abc', 'cb') from dual
- 如果您进行相同的转换,您会得到cb
= 0110010000010000
= 25616
,它作为一个数字显然小于 266340。
我认为它实际上在等效的 10gR1 文档中得到了更好的解释:
Oracle 逐字符比较两个值,直到第一个不同的字符。在该位置具有较大字符的值被认为较大。如果两个不同长度的值在较短的值结束之前是相同的,则认为较长的值更大。如果两个长度相等的值没有不同的字符,则认为这些值相等。
因此,假设 ASCII,c
(99) 大于a
(97),因此它不需要查看任一字符串中的任何其他字符。这永远看不到abc
和cba
等价的。
无论如何,您对这本书的解释感到困惑是完全正确的。