mysql以数字开头的字符串字段,查询条件字段值等于特定数字时,为何查询结果为以数字开头的数据

weixin_41097949 2018-07-18 04:24:09
如有一表test:id, type;
数据如下:
1,3a;
2,3b;
3, 5s;
select * from test where type = 3;
得到的结果为:请问这是为什么?
1,3a;
2,3b;
...全文
847 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rotel-刘志东 2018-07-19
  • 打赏
  • 举报
回复
数据类型不一样一定是做转换的,否则不同的类型怎么去对比比较。要把你的type类型转化为数字类型的。
zjcxc 2018-07-19
  • 打赏
  • 举报
回复
type=3
这两个的数据类型不一样,所以会转换为一样一类型再做比较,按照 mysql 的转换规则,会把 type 转成数字,而 3a,3b,3c 转成数字的结果就是 3,所以=3
你可以直接验证一下: select cast('3a' as signed);
同时,查询后执行 show warnings 时会看到相关的警告信息
weixin_41097949 2018-07-19
  • 打赏
  • 举报
回复
#5 zjcxc,您这么解释,我算通了,非常感谢。mysql做了转换,当查询条件为“字符串字段=数字”,mysql截取前端整数数字部分转换为整数型,再与给出的条件值比较。但mysql的这个规则不知是好还是不好。比如例中,按正常思维希望客户输入“3c”时才能看到“3c”这条记录,但客户输入3时,把“3a,3b,3c"都列出来了。
weixin_41097949 2018-07-18
  • 打赏
  • 举报
回复
二楼,您用 select * from test where type=3; 查询得出的结果是不是:
id type
1 3a
2 3b
3 3c
weixin_41097949 2018-07-18
  • 打赏
  • 举报
回复
感谢二位的热情解答,我的type是varchar型的,二楼您写的查询我能理解,我不能理解的是:我写的这个查询语句看起来应该是错误的,会报语法错误,或者查询结果为空,可结果是没有料想到的
iamboy_11 2018-07-18
  • 打赏
  • 举报
回复
根据你发的问题,我觉得应该这样写:
select * from test where type like '4%' 或者 select * from test where left(type,1) = 4
luyaran 2018-07-18
  • 打赏
  • 举报
回复
你的type的字段类型是什么啊?????

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧