为什么MySQL在调整字符串时会返回带零的条目?

时间:2015-04-17 17:18:30

标签: mysql

如果我有一个整数类型的列,以及该列中值为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也不重要。

可以避免这种行为吗?

3 个答案:

答案 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

要避免它:

  • 不要将字符串与整数进行比较
  • 在之前将ID转换为string 比较。但是,这将对性能产生负面影响 大结果。