-5

您好我根据sql中的字符串比较感到困惑。

select * from table where column1 = 'abc';

据我了解,字符串 'abc' 已转换为数字,让我们在此示例中假装 (1+2+3=6)。

这意味着

select * from table where column1 = 'cba'; 

也将具有相同的值 6。字符串不一样。请赐教。

编辑:因为你认为这是一个笑话。

"字符字母 King 被转换为数字表示。假设使用 AMERICAN NLS 设置的 US7ASCII 数据库字符集,文字 king 被转换为其序数字符值的总和:K+i+n+g = (75+105+ 110+103=393)。”

这是一本让我感到困惑的书中的确切文字。

4

2 回答 2

3

你宁愿这样看

    a= 00000100
    b= 00010000
    c= 01100100

    abc= 000001000001000001100100
    cba= 011001000001000000000100

因此不一样

于 2013-02-14T10:28:02.640 回答
1

引用似乎来自此 OCA/OCP Oracle Database 11g All-in-One Exam Guide 第 9 章的第 31 页。这似乎是不正确的(善良),因为如果它像当时那样工作abc并且cba确实会被视为等效。

11gR2 SQL 语言参考说:

在默认的二进制比较中,Oracle根据数据库字符集中字符的数字代码的连接值来比较字符串。如果一个字符在字符集中的数值大于另一个字符,则它大于另一个字符。

关键区别在于短语“连接值”,即更接近@JoroenMoonen 演示的内容,其中字符集中的数字代码拼凑在一起;而不是书中显示的值的总和。

但是,如果认为每个字符的数字代码被连接在一起,并且结果(可能很长!)字符串代表一个比较的数字,那将是一种误导。取这些值abc= 000001000001000001100100=266340cba= 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),因此它不需要查看任一字符串中的任何其他字符。这永远看不到abccba等价的。

无论如何,您对这本书的解释感到困惑是完全正确的。

于 2013-02-14T12:41:53.547 回答