我刚刚遇到一个有趣的MySQL数据类型转换案例。请考虑以下查询:
SELECT * FROM (SELECT 0 AS col) AS t WHERE t.col=123; #Yields 0 rows
SELECT * FROM (SELECT 0 AS col) AS t WHERE t.col="123"; #Yields 0 rows
SELECT * FROM (SELECT 0 AS col) AS t WHERE t.col="0"; #Yields 1 row, col=0
SELECT * FROM (SELECT 0 AS col) AS t WHERE t.col="abc"; #Yields 1 row, col=0
第1,2和3行对我来说似乎合乎逻辑。但是在第4行,为什么,为什么,亲爱的SQL,你是否如此热切地将"abc"
置于等于0
?!
我的意思是,我明白了 - "abc"
不是整数,所以0
最有意义......是否存在这种行为实际上有用的场景?据我所知,它可能只是导致错误(就像我们的应用程序一样)......
也许有一个MySQL“模式”可以启用像这样的自动类型转换警告吗?
答案 0 :(得分:2)
MySQL为数字上下文中的字符串执行隐式类型转换。字符串的前导数字字符将转换为数字,因此'abc'
等字符串将转换为0。
这可以非常方便,因为这种转换不会导致错误(显式转换)。
道德很简单:将常量与列进行比较时,请使列与列的类型相同。也就是说,不要比较字符串和数字,以免意外发生。
答案 1 :(得分:1)
这绝对是MySQL的工作方式。
当您使用将数字对象与字符串常量进行比较的比较时,字符串将被转换为整数。 MySQL尝试将字符串解释为数字,如下所示:
'0123abc' gets the value 123.
'1abc' gets the value 1.
'abc' gets the value 0.
这有什么用?如果你需要在'12abc'之后用'112abc'按数字顺序排序的数字文本字符串,它在ORDER BY
子句中派上用场。