如果我有一个整数类型的列,以及该列中值为0
的条目,例如:
+----------+---------------+----------------+
+ id (int) + name (string) + group_id (int) +
+----------+---------------+----------------+
+ 1 + Albert + 2 +
+----------+---------------+----------------+
+ 2 + Harry + 0 +
+----------+---------------+----------------+
如果我要查询SELECT * FROM users WHERE group_id = 'string'
,我会使用group_id
0
+----------+---------------+----------------+
+ 2 + Harry + 0 +
+----------+---------------+----------------+
这取决于什么?它发生在MyISAM和InnoDB上,如果group_id
被允许NULL
也不重要。
可以避免这种行为吗?
答案 0 :(得分:0)
当字符串不能被解释为数字时(或者如果没有正确完成),它将始终返回0.
这也可以通过提供仅包含数字的整数或字符串来避免。
答案 1 :(得分:0)
当它将group_id
(整数)的值与字符串进行比较时,MySQL会将这两个值转换为浮点数(来源:http://dev.mysql.com/doc/refman/5.7/en/type-conversion.html)
在将字符串转换为数字的过程中,MySQL会停止字符串的第一个非数字字符并忽略其余字符。如果字符串不以数字开头,则将其转换为数字0
。
可以避免这种行为吗?
不要依赖MySQL为您输入输入数据的验证。由于您知道group_id
是一个数字,因此请在客户端应用程序中检查用于生成查询的值,并始终使其成为数字或类似数字的字符串。
答案 2 :(得分:0)
因为mysql在转换为整数类型时将字符串计算为0
。由于您要与整数(id)进行比较,因此它会自动将字符串转换为兼容类型(整数)。
您可以使用以下简单查询来测试/证明这一点:
select cast('string' as unsigned)
在这里,您将字符串“string”转换为无符号整数,结果为0
要避免它:
string
比较。但是,这将对性能产生负面影响
大结果。