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