2016-05-29 100 views
8

我有一個表稱爲tabela1512823699024883看起來像這樣: enter image description hereMySQL的展示奇怪的結果

在我運行這樣的查詢:

SELECT * FROM tabela1512823699024883 WHERE `age` = 'male' 

這個查詢是沒有意義的,因爲ageint類型,我在查詢中查找string值,但MySQL仍然返回任何空行。這是什麼查詢返回: enter image description here 因此age行不包含male值在任何行中都不返回。這怎麼可能?

+3

我想,mysql試圖將string'male'轉換爲int ..這將是0,並返回結果,其中'age = 0' –

+1

我希望這些截圖中不是真正的用戶數據? – Bergi

回答

14

將字符串強制轉換爲整數類型會發生同樣的問題。

SELECT CAST('male' as SIGNED); #0 
#or 
SELECT CAST('male' as UNSIGNED); #0 

但是,如果在字符串內提供了一個數字。

SELECT CAST('1234male' as UNSIGNED); #1234 
#and 
SELECT CAST('male1234' as UNSIGNED); #0 

要解決塔上的問題,使用BINARY,這也將導致文本值成爲區分大小寫。

SELECT * FROM tabela1512823699024883 WHERE BINARY `age` = 'male'; 
+0

非常好的解釋和很好的例子。 – pbalazek

+0

接受,因爲它不僅給出了很好的解釋,而且還解決了從表中返回精確值的問題。偉大的工作人! – Ognj3n

11

試試這個簡單的查詢:

SELECT 'male' + 0 

這似乎沒有什麼意義。但是,查詢執行並返回值0。這是因爲隱式類型轉換。字符串值'male'被轉換爲0,然後被添加到0,因此0被返回。

同樣的事情發生在您的查詢中。 'male'轉換爲0時,與int類型的字段進行比較。

3

「男」是0!所以你一直得到記錄,其中年齡爲0。要真正瞭解發生了什麼,只是做:

select user_name, age, age='male' from tabela1512823699024883; 

你的第三列將是1對含有「0」時代的記錄,和「0」不含記錄 - 零年齡。

2

這裏的問題是,每當你嘗試比較字符串到整數列,該值將被轉換爲列的數據類型。同樣的情況下將與浮動,大INT,微小INT等情況的發生

什麼都值相比首先被MySQL的引擎

這裏投給特定的數據類型是通過測試查詢的結果轉換很少的值。

select cast('' AS UNSIGNED), cast('anything' AS UNSIGNED), cast(NULL AS UNSIGNED), cast(35.56 AS UNSIGNED), cast(NOW() AS UNSIGNED), cast(1 AS UNSIGNED), cast('Test' AS BINARY), cast('' AS BINARY); 

Result of casting few data types

SELECT * FROM `test_type` WHERE flt = 'test' 

Here flt is float type column.

的FLT是浮子類型的列。