整数字段查询字符串返回所有含0行,ID字段无此问题原因咨询
问题原因解析:字符串与整数字段查询的差异
这其实是数据库隐式类型转换的规则在起作用,咱们一步步拆解你遇到的两种情况:
1. number字段查询返回0值行的原因
当你在查询语句里用字符串和整数类型的number字段做等值比较时,数据库会自动触发隐式类型转换:把字符串尝试转换成整数类型。
- 像
"2"这种能识别的数字字符串,会被正常转换成整数2,所以SELECT * FROM seats WHERE number = "2"能匹配到对应行,符合预期。 - 而
"hello"这种纯非数字字符串,转换后会得到整数0,这就导致你的查询等价于SELECT * FROM seats WHERE number = 0,自然就返回了所有number字段值为0的行。
2. id字段查询无结果的原因
通常id字段是表的主键,类型多为无符号整数(INT UNSIGNED),并且主键值一般从1开始自增,不会有0这个值。
当你用"hello"和id字段比较时,同样会触发隐式转换,把"hello"转成整数0,但你的表中没有id=0的行,所以查询自然没有结果返回。
另外,部分数据库对主键字段的类型校验会更严格,也会加剧这种无结果的情况。
小验证技巧
你可以执行下面的语句验证转换结果:
-- 查看非数字字符串转整数的结果 SELECT CAST("hello" AS UNSIGNED); -- 或者用算术运算触发转换 SELECT "hello" + 0;
这两个语句的结果都会是0,正好对应你遇到的现象。
内容的提问来源于stack exchange,提问作者Ruben Gonzalez
相关产品推荐
相关产品推荐

