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的权限。
答案 0 :(得分:1)
如果您需要userid
列(例如BETWEEN
)上的数字排序功能,则此列应为数字类型。我建议在此列中使用DECIMAL(30)
。然后,传入的数值应在表格中的此列上正确排序。
您现在有几个问题。一种是您正在将userid
与数字文字进行比较,这意味着可能会在幕后触发一些异乎寻常的强制转换规则。您不想要那样,也不想将数字与文本列进行比较。使用DECIMAL
,您可以立即解决这两个问题。