MySQL为何将含字符的ID值(如1dslkfjsd)匹配为纯数字ID?
为什么MySQL会把"1dslkfjsd"等同于int类型的1?
这个问题其实是MySQL里很典型的隐式类型转换行为导致的,我来给你掰扯清楚:
- 类型不匹配时的自动转换规则:当你把字符串(比如
"1dslkfjsd")和int类型的id列做比较时,MySQL不会直接报错,而是会自动把字符串转换成数字类型后再进行比较。 - 字符串转数字的具体逻辑:MySQL会从字符串的开头位置提取连续的数字字符,直到遇到第一个非数字字符就停止。如果字符串开头不是数字,转换结果就是0。
- 你的例子里,
"1dslkfjsd"开头是数字1,后面跟着非数字的字母,所以转换后得到的数字就是1,此时查询条件等价于WHERE id = 1,自然会匹配到id=1的记录。 - 再举几个验证例子:
- 字符串
"abc123"转数字是0,WHERE id = "abc123"会查找id=0的记录(如果存在的话) - 字符串
"123xyz"转数字是123,会匹配id=123的记录
- 字符串
- 你的例子里,
- 如何避免这种“意外匹配”:
- 若要严格匹配字符串形式的ID,可将
id列类型改为varchar(但通常不推荐,int类型在存储和查询效率上更优) - 或者查询时显式把int列转为字符串再比较,比如:
这样就会进行字符串精确匹配,不会再命中id=1的记录。SELECT * FROM `accounts` WHERE CAST(`id` AS CHAR) = "1dslkfjsd";
- 若要严格匹配字符串形式的ID,可将
内容的提问来源于stack exchange,提问作者Feelsbadman
相关产品推荐
相关产品推荐

