【发布时间】:2021-03-18 08:10:32
【问题描述】:
我的 MySQL 数据库中有一个名为 users 的表,并且多年来我一直在将此数据库与具有 ORM 结构的 Ruby on Rails 应用程序一起使用。该表有id字段,该字段配置为AI(自增),BIGINT。
我的用户表示例;
+----+---------+
| id | name |
+----+---------+
| 1 | John |
| 2 | Tommy |
| 3 | ... |
| 4 | ... |
| 5 | ... |
| 6 | ... |
+----+---------+
我面临的问题是当我执行以下查询时,我得到了意外的行。
SELECT * FROM users WHERE id = '1AW3F4SEFR';
此查询返回与以下查询完全相同的值,
SELECT * FROM users WHERE id = 1;
我不知道为什么 SQL 允许我在数据类型 INT 的 WHERE 子句中使用字符串。正如我们从示例中看到的那样,我的数据库将我给出的字符串转换为位置 0 处的整数。我的意思是,我搜索 1AW3F4SEFR 并且我希望不会得到任何结果。但是 SQL 语句返回 id = 1 的结果。
在 Oracle SQL 中,这个完全相同的查询的行为是完全不同的。所以,我相信 MySQL 有一些不同的地方。但我不确定是什么原因造成的。
【问题讨论】:
-
当您将字符串与数字进行比较时,它会在比较之前自动将字符串转换为数字。
-
如果字符串以数字开头,将其转换为数字会返回该初始数字。
-
所以
'123abc'变成了123。 -
...如果您使用的是 MySQL。其他数据库引发错误,或将整数转换为字符串。
-
我一直认为这是 MySQL 中的一个缺陷。但是在我看来,无论如何你都不应该将数值与字符串进行比较。如果列是数字,则将其与数字进行比较。不,如果你将数字与字符串进行比较,MySQL 会应用这种奇怪的转换。 AFAIK 没有办法防止这种情况发生。