You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用数值类型查询VARCHAR列的隐式转换及异常结果咨询

为什么VARCHAR字段匹配大整数会返回所有行?

这问题我之前也踩过坑,核心原因是MySQL的隐式类型转换引发了数值溢出,具体拆解下:

首先看你的场景:

  • 表中tvarchar(255)类型,存的是看起来像超大整数的字符串,但本质还是字符串类型。
  • 你写的查询条件是where t = 12511023900355495873,这里右边是整数类型,MySQL会遵循隐式转换规则,把左边的字符串t转换成整数来做比较。

但问题出在数值大小上:MySQL里有符号BIGINT的最大值是9223372036854775807,而你用的12511023900355495873比这个值大太多了。当字符串转成整数时,因为超出了BIGINT的存储范围,会直接溢出,最终得到的是BIGINT的最大值(或者溢出后的等效值)。

你表中的三个字符串:125110239003554958731251102390035549587212511023900355495874,它们转换成整数时都会因为溢出得到同一个值,所以where条件里的比较就变成了“这个溢出值 = 溢出值”,自然三条数据都被匹配出来了。

你可以自己验证下:执行select t, cast(t as signed) from test;,会发现三个t对应的转换结果完全一样,都是9223372036854775807

解决办法有两个:

  • 直接用字符串匹配:把查询条件的整数加上引号,变成select * from test where t = '12511023900355495873';,这样MySQL会直接做字符串精确对比,不会触发类型转换。
  • 调整字段类型:如果这些值确实需要作为数值处理,把t的类型改成DECIMAL(20,0)(可根据实际长度调整精度),DECIMAL可以存储更大的精确数值,不会出现溢出问题。

内容的提问来源于stack exchange,提问作者liangbin.hu

火山引擎 最新活动