MySQL中varchar类型字段使用=查询为何出现类似LIKE的结果?
问题原因解析
这是因为字符串字段与数字进行比较时的隐式类型转换导致的,具体逻辑如下:
- 当你执行
where order_id = 48时,由于order_id是varchar(字符串)类型,数据库会自动把每条记录的order_id值转换成数字类型,再和数字48做比较。 - 转换规则是:如果字符串开头是连续的数字,就截取这部分数字转换成数值;如果字符串开头不是数字,转换结果通常是0或NULL(不同数据库细节略有差异)。
- 举个例子:如果你的表中有
order_id为'48'、'48xxx'、'48-2024'这类记录,它们转换成数字后都是48,所以都会被这个条件匹配出来——这就是你觉得结果像LIKE查询的原因。 - 而当你改成
where order_id = '48'时,是严格的字符串相等匹配,只有order_id完全等于'48'的记录才会被选中,而你表中没有这类记录,所以结果为空,符合预期。
另外提醒一下:这种隐式类型转换不仅会导致结果不符合预期,还会让order_id字段上的索引失效,拖慢查询速度,所以日常写SQL时,一定要保证查询条件的类型和字段类型一致。
内容的提问来源于stack exchange,提问作者Austin Xian
相关产品推荐
相关产品推荐

