2011-11-29 56 views
1

我查詢的INT列一個字符串,像這樣:MySQL的意外返回結果爲 「WHERE integer_column = 'STRING_VALUE'」

SELECT id 
FROM (`navigation_links`) 
WHERE `navigation_links`.`navigation_link_id` = 'anyRandomString' 

(原來,這是由意外)

  • 預期的結果:0,因爲navigation_link_idINT
  • 實際結果:這好像又回到每一行,其0

這將返回完全相反的:

SELECT id 
FROM (`navigation_links`) 
WHERE `navigation_links`.`navigation_link_id` != 'anyRandomString' 

下面是表,剝離下來:

CREATE TABLE `navigation_links` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `navigation_link_id` INT(10) UNSIGNED NULL DEFAULT '0', 
    `navigation_group_id` INT(10) UNSIGNED NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) 

任何想法,這是怎麼一回事?

回答

3

當比較不同類型的值時,MySQL將嘗試convert這樣的值之一,因此可以進行比較。在字符串和數字的情況下,MySQL將通過將任何前導數字解釋爲數字來轉換字符串。沒有前導數字對應於0的數值,這在一些方面是有意義的:

  • 前導零通常可以被丟棄; '042'與'42'相同。因此'0'和''是相同的。
  • 當數字串轉換爲數字,該號碼的初始值是0。該字符串被遍歷,加入的數字的數量和由鹼增殖:

    n = 0 
    while str[i] is a digit character: 
        n += str[i] as a digit 
        ++i 
    return n 
    

    如果有沒有數字字符,數值爲0.

  • 空字符串沒有任何內容,所以在以無數字開頭的字符串開始處的數字字符串是空的。在這種思維方式下,NULL也可以是沒有將前導數字解釋爲數字的字符串的值。這後一個選項並沒有被MySQL開發者選中,可能使實現稍微簡單一些。

+0

我明白了,所以在每個「數字」被選中之後,它會歸結爲「0」,然後呢?我注意到'where int ='3x''被轉換爲'3',但是'where int ='x3''被轉換爲'0'。我想這種轉換有時候很有意義,但我對這種行爲感到驚訝。 –

+0

@Madmartigan:請注意只有前導數字纔會被轉換,而不是第一個連續的數字子串。這與C函數atoi和strtol的行爲是一樣的。 MySQL可能會使用其中的一個(快速瀏覽源代碼會告訴你這是否是這樣)。您可以使用'CAST'和'CONVERT'函數來查看MySQL將字符串轉換爲什麼數字。 – outis