以下是对MySQL数据库表的SQL查询示例,该表包含32位长度的varchar字符串作为UUID。正如您所看到的,WHERE子句不包含完整的字符串,但MySQL返回结果。
SELECT * FROM table WHERE uuid = 9
id uuid name
1 9c8f8632cbbac5b0708a9920f6fac755 John Smith
这是一种预期的行为吗?MySQL会转换字段的类型和搜索条件吗?
答案 0 :(得分:3)
这是预期的行为。发生的事情是您将字符串与整数进行比较。在这种情况下,字符串将根据前导数字转换为数字。
因为只有第一个字母是数字,所以它会转换为9 - 所以相等就可以了。
答案 1 :(得分:3)
看起来MySQL执行从整数到字符串的隐式转换。
mysql> select 9 = '9asdasd';
+---------------+
| 9 = '9asdasd' |
+---------------+
| 1 |
+---------------+
1 rows in set (0.02 sec)
mysql> select 9 = '79asdasd';
+----------------+
| 9 = '79asdasd' |
+----------------+
| 0 |
+----------------+
1 rows in set (0.01 sec)
显然你需要确保有引号来避免这种情况:
mysql> select '9' = '9asdasd';
+-----------------+
| '9' = '9asdasd' |
+-----------------+
| 0 |
+-----------------+
1 rows in set (0.01 sec)