具有隐式数据类型转换的MySQL查询返回错误结果

时间:2018-12-04 14:32:43

标签: mysql sql char numbers implicit-conversion

mysql的SQL查询语法具有自动,方便的数字转换为char的功能(反之亦然),这很危险。

考虑一个具有用户名varchar PK的表

+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| userid     | varchar(40) | NO   | PRI | NULL    |       |
| cachetime  | datetime    | NO   |     | NULL    |       |
| outputjson | text        | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

错误是:1538993648784210100和1538993648784210199之间的任何数字作为用户ID传递都会得到相同的结果。

mysql> select userid from test_cache where userid = 1538993648784210100;
+---------------------+
| userid              |
+---------------------+
| 1538993648784210176 |
| 1538993648784210178 |
+---------------------+

当我将userid明确地用引号引起来时,它会起作用并立即返回这两个userid的权限。

1 个答案:

答案 0 :(得分:1)

如果您需要userid列(例如BETWEEN)上的数字排序功能,则此列应为数字类型。我建议在此列中使用DECIMAL(30)。然后,传入的数值应在表格中的此列上正确排序。

您现在有几个问题。一种是您正在将userid数字文字进行比较,这意味着可能会在幕后触发一些异乎寻常的强制转换规则。您不想要那样,也不想将数字与文本列进行比较。使用DECIMAL,您可以立即解决这两个问题。