2011-01-05 71 views
1

我最近剛修正了一些我的代碼中的錯誤,希望有人能向我解釋爲什麼發生錯誤。Mysql Like + Wild Card vs Equals Operator

我有這樣的查詢:

SELECT * FROM my_table WHERE my_field=13 

沒想到,這回是行,其中my_field等於或者1313a。修復很簡單,我改變了查詢:

SELECT * FROM my_table WHERE my_field='13' 

我的問題是,這應該是這樣嗎?我一直認爲,返回一個類似的領域,你會使用類似:

SELECT * FROM my_table WHERE my_field LIKE '13%' 

是什麼樣+外卡之間的區別VS等號操作員沒有引號?

+0

我很想看看會是什麼原因... – Chandu 2011-01-05 20:55:53

+0

謝謝大家。你們都似乎是對的,對不起,我不能選擇你們全部:-) – 2011-01-05 21:51:17

回答

3

此語句爲my_field = '13a'返回行:

SELECT * FROM my_table WHERE my_field=13 

由於MySQL執行類型從字符串轉換在比較期間與數,轉彎'13a'13。更多關於那。

添加引號會將整數轉換爲字符串,因此MySQL僅執行字符串比較。顯然,'13'不能等於'13a'

LIKE子句總是執行字符串比較(除非其中一個操作數是NULL,在這種情況下結果是NULL)。

1

我的猜測是,因爲你沒有用引號把它括起來,而列是char/varchar列,MySQL試圖將varchar列隱式轉換爲int。

如果該表中的某行包含無法轉換爲int的值,則可能會出現錯誤。此外,由於轉換,您可能在該列上的任何索引都不會被使用。

1

這與類型和類型轉換有關。使用my_field=13時,13是一個整數,而my_field在您的情況下可能是某種形式的文本/字符串。在這種情況下,mysql會嘗試將兩者都轉換爲浮點數並進行比較。

因此MySQL試圖轉換E,G,「13A」來浮子,這將其在13和13 = 13

my_field = '13',兩個操作數是文本和將作爲文本使用=

進行比較

my_field like '13%'這兩個操作數都是文本,並將使用LIKE進行比較,其中特殊的%表示通配符。

你可以閱讀關於類型轉換mysql使用here

1

這是因爲MySQL類型轉換以這種方式工作。看到這裏:http://dev.mysql.com/doc/refman/5.0/en/type-conversion.html

它也發佈警告。看看下面的代碼

mysql> select 12 = '12bibo'; 
    +---------------+ 
    | 12 = '12bibo' | 
    +---------------+ 
    |    1 | 
    +---------------+ 
    1 row in set, 1 warning (0.00 sec) 

    mysql> show warnings; 
    +---------+------+--------------------------------------------+ 
    | Level | Code | Message         | 
    +---------+------+--------------------------------------------+ 
    | Warning | 1292 | Truncated incorrect DOUBLE value: '12bibo' | 
    +---------+------+--------------------------------------------+ 
    1 row in set (0.00 sec) 

看起來像有人提出了一個錯誤,以及:http://bugs.mysql.com/bug.php?id=42241