MySQL对字符串的隐式转换

一、背景
从一条sql引起线上事故说起,看一眼SQL语句(topic_key为varchar类型):

SELECT * FROM topic WHERE topic_key IN ('123213', 0);

结果(只取了部分结果集):
sql查询结果
欲操作SQL:

SELECT * FROM topic WHERE topic_key IN ('123456', '0');

欲得到结果:
欲得到结果集
二、分析
1.'0’和0有什么区别?
就是简单的字符串0和数字0的区别,我们知道IN关键字就是=ALL(集合),即='0’只会查出为内容为0的记录,多查出的数据,即=0的数据后面说道。
2.为什么会多查出一部分数据?
这我们就得从MySQL的隐式转换说起,我们欲根据字符串查询,正常查询参数应该是字符串类型,如果写成数字类型,则MySQL会对查询参数做隐式转换,对结果集给出查询参数类型的隐式转换,文字理解无趣,下面看一条SQL:

SELECT topic_key, CAST(topic_key AS UNSIGNED) AS implicit_value FROM topic;

结果:
字符串隐式转换值
(1)CAST(expr AS type)是内置函数,把字符串转换成对应整数值
(2)UNSIGNED表示无符号,这个不知道可以自行先了解下,不是本文重点
由上数据集,我们可以看出纯数字的字符串转换成对应数字,字符串都会转成0,所以我们就能知道为什么会多出数据,多的数据都是字符串值
三、总结
1.数据库操作很重要,写SQL一定要细心、严谨
2.对于字符串参数查询一定要按照规定格式来,加上’‘是基本操作,索引地方也是如此,少了’'索引也会失效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值