2016-08-23 48 views
0

任何人都可以解釋爲什麼查詢:選擇與加盟輸出不準確匹配[MySQL的]

select rma.id, history_transactions.reference 
from history_transactions 
join rma on history_transactions.reference = rma.id 

返回:

id  | reference 
100144 | 100144 
102299 | 102299a 
100316 | 100316AFEN1 

不能讓它只顯示100%匹配,所以只有第一行。如果有人能解釋它爲什麼會發生,那就太好了。

回答

2

顯然rma.id列是數字(整數),而參考場是文本的,因爲它包含文本以及。

正如MySQL文檔Type Conversion in Expression Evaluation所描述的那樣,如果您將文本與數字進行比較,則將比較結果作爲浮點數字進行比較,即將參考字段轉換爲數字。

只要章程可以被解釋爲數字,MySQL通過從左到右評估其字符來將字符串轉換爲數字。如果遇到不能被評估爲數字的字符,則MySQL停止評估並返回以前的字符作爲數字值。

在第二條記錄的情況下,字母a是第一個不能被評估爲數字的字符,因此'102299a'字符串的數值爲102299。同樣的邏輯適用於第3條記錄。

要強制MySQL僅返回完全匹配,請在查詢中明確將rma.id轉換爲使用cast() or convert()函數的字符串。這樣比較將作爲字符串完成,而不是浮點數。

+0

感謝解釋,投(rma.id作爲字符)做的工作! – arti

1

原因很可能是隱式類型轉換。我的猜測是id字段是integer類型,而reference字段是varchar類型。因此,比較MySQL時將varchar轉換爲數字。所以,例如值'10299a'轉換爲10299並且是然後id相應的值相比較字段。

Live demo of the issue

+0

我怎麼能100%匹配呢? – arti

+0

MySQL將字符串轉換爲浮點數,而不是int! – Shadow

+0

@arti您必須將'id'強制轉換爲'varchar'。 –

0

隱式數據類型轉換。

我懷疑id列被聲明爲數字數據類型。最有可能的是INT

reference列被聲明爲字符類型。最有可能的是VARCHAR

要進行相等比較,MySQL無法將「字符串」與「數字」進行比較。

因此,MySQL隱式地將字符串值轉換爲數字,然後進行數值比較。

其他數據庫會給出一個錯誤,給出一個不是有效數字的字符串。

但MySQL允許轉換(沒有錯誤或警告。)

作爲示範,這些表情引起的MySQL做一個字符串的隱式轉換爲數字:

SELECT '123ABC' + 0 
    , '4D5E6F' + 0 
    , 'G7H8I9' + 0 

鑑於你的價值觀,例如

SELECT '100316AFEN1' + 0 

我們看到, MySQL返回一個數值100316,它用來比較。