2013-02-14 83 views
-5

你好,我很困惑根据字符串比较在sql中。比较字符串在哪里条款

select * from table where column1 = 'abc'; 

据我所知的字符串 'ABC' 被转换为数字让我们假装(1 + 2 + 3 = 6)在这个例子中。

这意味着

select * from table where column1 = 'cba'; 

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

编辑:因为你认为这是一个笑话。假设一个带有AMERICAN NLS设置的US7ASCII数据库字符集,文字王被转换成它的序数字符值的和:K + i + n + g =( 75 + 105 + 110 + 103 = 393)“。

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

+0

Oracle近来变得非常疯狂...... – 2013-02-14 10:25:59

+0

您是否对隐式转换感到困惑,其中诸如“some_number_data_type ='6'”之类的谓词要求将'6'从字符串转换为数字? – 2013-02-14 10:31:55

+0

你低估了我。那本书是错的。 – pethel 2014-05-09 08:57:14

回答

1

的报价似乎是从chapter 9 of this OCA/OCP Oracle Database 11g All-in-One Exam Guide 31页。这似乎是不正确的(善良的),因为如果它的工作,然后abccba确实被视为等同。

11gR2 SQL language reference说:

在二进制比较,这是缺省值,甲骨文根据 在数据库中的字符集的文字数字码的级联值进行比较字符 字符串。如果一个字符的数值大于 字符集中的另一个字符,则其字符数大于另一字符 。

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

但是,如果想要连接每个字符的数字代码以及由此产生的(可能很长的!)字符串代表一个被比较的数字,那将是误导。取这些值,abc = 000001000001000001100100 = 266340cba = 011001000001000000000100 = 6557700。只是比较6557700与266340确实会显示cba'大于'abc。但cbabc“大于” - select greatest('abc', 'cb') from dual - 如果你做同样的转换你cb = 0110010000010000 = 25616,这为数字显然低于266340.

我认为它实际上是更好的equivalent 10gR1 documentation解释:

Oracle按字符比较两个值,直到第一个 字符不同。在 位置中具有较大字符的值被认为是较大的。如果两个不同长度的值是相同的,直到较短的一个结束,则较长的值为 认为更大。如果两个相等长度的值没有不同的 个字符,则认为这些值相等。

因此,假设ASCII,c(99)大于a(97),因此它并不需要看看在任何字符串中的任何进一步的字符。这永远不会看到abccba等效。

无论如何,你完全可以被这本书的解释所迷惑。

+0

谢谢你不要叫我愚蠢,你对这本书是正确的;) – pethel 2013-02-14 13:24:21

3

你愿意看到像这样

a= 00000100 
    b= 00010000 
    c= 01100100 

    abc= 000001000001000001100100 
    cba= 011001000001000000000100 

因此不一样