自动MySQL数据类型转换

时间:2015-09-24 23:38:37

标签: mysql sql casting

我刚刚遇到一个有趣的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“模式”可以启用像这样的自动类型转换警告吗?

2 个答案:

答案 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子句中派上用场。