你好我根据sql中的字符串比较感到困惑。
select * from table where column1 = 'abc';
据我所知,字符串'abc'被转换为数字,让我们假装(1 + 2 + 3 = 6)这个例子。
这意味着
select * from table where column1 = 'cba';
也将具有相同的值6.字符串不一样。请赐教。
编辑:因为你认为这是一个笑话。
“将字符字母King转换为数字表示。假设US7ASCII数据库字符集具有AMERICAN NLS设置,则将文字王转换为其序数字符值的总和:K + i + n + g =(75 + 105 + 110 + 103 = 393)“。
这是一本令我困惑的书中的确切文字。
答案 0 :(得分:3)
你宁愿这样看
a= 00000100
b= 00010000
c= 01100100
abc= 000001000001000001100100
cba= 011001000001000000000100
因此不一样
答案 1 :(得分:1)
引用似乎来自chapter 9 of this OCA/OCP Oracle Database 11g All-in-One Exam Guide的第31页。这似乎是不正确的(善意),因为如果它起作用那么abc
和cba
确实会被视为等效。
11gR2 SQL language reference说:
在二进制比较中,默认情况下,Oracle比较字符 字符串根据数字代码的连接值 数据库字符集中的字符。一个角色更大 如果它具有比另一个更大的数值,则比另一个 字符集。
关键区别是短语'连接值',即更接近@JoroenMoonen演示的内容,其中字符集中的数字代码拼凑在一起;而不是书中显示的价值总和。
但是,考虑连接的每个字符的数字代码以及表示要比较的数字的结果(可能非常长!)字符串会产生误导。取这些值后,abc
= 000001000001000001100100
= 266340
和cba
= 011001000001000000000100
= 6557700
。只需将6557700与266340进行比较,确实会显示cba
大于'abc
。但cb
也“大于”abc
- select greatest('abc', 'cb') from dual
- 如果您进行相同的转换,则会得到cb
= 0110010000010000
= 25616
,这个数字显然小于266340。
我认为在equivalent 10gR1 documentation:
中实际上有更好的解释Oracle将两个字符逐个字符地比较 不同的人物。具有更大字符的值 位置被认为更大。如果两个不同长度的值是 相同到较短的一端,则值越长 考虑更大。如果两个相等长度的值没有差别 字符,则认为这些值相等。
因此,假设ASCII,c
(99)大于a
(97),因此不需要查看任何字符串中的任何其他字符。这永远不会将abc
和cba
视为等效。
无论如何,你对这本书的解释感到困惑是完全正确的。