2016-09-06 40 views
0

我有一個簡單的表:意外行爲數由字母

Entity 
    ID : int 
    Name : varchar(10) 

我被他們的ID查找實體和發現,讓我感到驚訝的結果。假設存在ID = 10的實體。當我運行下面的查詢,我得到如下結果:

SELECT * from Entity WHERE ID = 10  Found Entity 10 (as expected) 
SELECT * from Entity WHERE ID = '10'  Found Entity 10 (as expected) 
SELECT * from Entity WHERE ID = A   Syntax error (as expected) 
SELECT * from Entity WHERE ID = 'A'  Zero records found (as expected) 
SELECT * from Entity WHERE ID = 10A  Syntax error (as expected) 
SELECT * from Entity WHERE ID = '10A'  Found Entity 10 (WTF) 

最後的查詢似乎忽略了「A」和我好像在10這個剛剛通過評估查詢是不是我所期待。

這是標準行爲嗎?我無法找到任何doco。

回答

2

是的,這是MySQL的標準行爲。

它記錄在Type Conversion for Expression Evaluation

當運算符與不同類型的操作數一起使用時,會發生類型轉換以使操作數兼容。一些轉換隱式發生。例如,MySQL會根據需要自動將數字轉換爲字符串,反之亦然。

將字符串轉換爲數字會導致在第一個非數字字符處截斷它,如果第一個字符不是數字,則爲0。

參見:Can I configure MySQL's typecasting to consider 0 != 'foo'?

還要注意的是, '10A' 查詢(和 'A' 一個也)應該扔了一個警告。查詢後查看SHOW WARNINGS;。你的客戶應該已經提醒你注意到了一個警告。如果沒有,你應該向供應商大聲抱怨,因爲這是違反行爲。

1

當將一個文本值轉換爲一個int值時,就像MySQL在查找id之前用文本字面值所做的那樣,它的行爲是使用所有數字直到第一個非數字值。

沒有第一個非數字前的任何數字(即他們開始用非數字)

文本值獲得投0

我找不到聲明此行爲作爲合同的參考,但這是一個SQLFiddle that shows it in action

+0

你能爲此提供一個參考嗎? –

+0

這只是MySQL嗎?還是應該所有RDBMS都這樣做? – dave

+0

@dave afaik它只是MySQL。如果遇到非數字,其他dbs會爆炸並輸入錯誤。 – Bohemian