mysql查询返回不正确的结果

okxuctiv  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(435)

mysql在其sql查询语法中有一个自动、方便的从数字到字符(反之亦然)的转换,这种转换行为非常危险。
考虑一个带有userid varchar pk的表

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

错误是:作为userid传递的1538993648784210100和1538993648784210199之间的任何数字都会给出相同的结果。

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

当我显式地用引号将userid括起来时,它工作并立即返回这两个userid的值。

ht4b089n

ht4b089n1#

如果您需要在 userid 列(例如。 BETWEEN ),则此列应为数字类型。我建议使用 DECIMAL(30) 对于此列。然后,传入的数值应该根据表中的此列正确排序。
你现在有几个问题。一是你在比较 userid 反对数字文字,这意味着可能会有一些异国情调的铸造规则下发射引擎盖。你不想这样,你也不想和文本列比较数字。使用 DECIMAL 你可以同时解决这两个问题。

相关问题