MySQL中substring截取051与51匹配的原理及表连接疑问
问题说明
有Person和Country两张表,想要通过手机号的前三位与Country表的country_code字段关联,编写的查询语句如下:
select * FROM person left join country on country_code=substring(phone_number,1,3)
疑问
- 截取得到的字符串"051",为什么能和
country_code里的"51"匹配?两者看起来完全不同。
查询语句的输出结果示意图:[查询结果展示]
解答
这是数据库隐式类型转换导致的:
如果country_code是数值类型(比如INT),而substring函数截取手机号得到的是字符串类型('051'),数据库会自动将字符串转换为数值,'051'转成数值后就是51,因此能和country_code的51匹配成功。
如果要避免这种隐式转换带来的意外匹配,建议统一匹配时的类型:
- 方案1:把
country_code转为字符串类型再匹配
select * FROM person left join country on cast(country_code as varchar) = substring(phone_number,1,3)
- 方案2:把截取的字符串转为数值类型(注意:如果手机号开头有非数字字符,会触发转换错误)
select * FROM person left join country on country_code = cast(substring(phone_number,1,3) as int)
内容的提问来源于stack exchange,提问作者justjokingbro
相关产品推荐
相关产品推荐

