2013-02-14 186 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 

因此不一樣