You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:42:49