我有一個表稱爲tabela1512823699024883
看起來像這樣: MySQL的展示奇怪的結果
在我運行這樣的查詢:
SELECT * FROM tabela1512823699024883 WHERE `age` = 'male'
這個查詢是沒有意義的,因爲age
列int
類型,我在查詢中查找string
值,但MySQL
仍然返回任何空行。這是什麼查詢返回: 因此age
行不包含male
值在任何行中都不返回。這怎麼可能?
我有一個表稱爲tabela1512823699024883
看起來像這樣: MySQL的展示奇怪的結果
在我運行這樣的查詢:
SELECT * FROM tabela1512823699024883 WHERE `age` = 'male'
這個查詢是沒有意義的,因爲age
列int
類型,我在查詢中查找string
值,但MySQL
仍然返回任何空行。這是什麼查詢返回: 因此age
行不包含male
值在任何行中都不返回。這怎麼可能?
將字符串強制轉換爲整數類型會發生同樣的問題。
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';
試試這個簡單的查詢:
SELECT 'male' + 0
這似乎沒有什麼意義。但是,查詢執行並返回值0
。這是因爲隱式類型轉換。字符串值'male'
被轉換爲0
,然後被添加到0
,因此0
被返回。
同樣的事情發生在您的查詢中。 'male'
轉換爲0
時,與int
類型的字段進行比較。
「男」是0!所以你一直得到記錄,其中年齡爲0。要真正瞭解發生了什麼,只是做:
select user_name, age, age='male' from tabela1512823699024883;
你的第三列將是1對含有「0」時代的記錄,和「0」不含記錄 - 零年齡。
這裏的問題是,每當你嘗試比較字符串到整數列,該值將被轉換爲列的數據類型。同樣的情況下將與浮動,大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);
SELECT * FROM `test_type` WHERE flt = 'test'
的FLT是浮子類型的列。
我想,mysql試圖將string'male'轉換爲int ..這將是0,並返回結果,其中'age = 0' –
我希望這些截圖中不是真正的用戶數據? – Bergi