【MySQL】 (20 = "20XXX" ) 结果会是True

今天S.O有一个有趣问题
sql - MySQL select from INT column - Stack
Overflow

为什么资料int型态的20跟字串型态的"20XXX"比较,答案是True

select (20 = "20XXX") ;

原因:

因为MySQL在字串转型的过程中是宽鬆的
"20XXX"只取开头取字符,忽略XXX
所以得到的比较字串select (20 = 20)

因为判断是以开头字串为準
当开头不是以数字开头,答案会是false(0)

select (20 = "XXX20") ;

得到的比较字串select (20 = 0)


假如大大们有特殊需求,遇到需要这样比较的情况
例如:
搜寻栏位不确定是整数还是字串型态
又不想要有误判的情况

可以另外使用length来比较,只是效能一定会减分

select  (20 = "20XXX" and length(20) = length("20XXX") ) ;

线上测试连结


【更新】
比较方法还可以使用 @纯真的人 大大的binary方式

select * from transactions where binary id = "20xxx"; 

原理可以看 @fysh711426 大大的解说

研究了一下 binary 的原理,

一开始以为因为 id 被转型成二进制,
所以后面的字串才没有被隐转成 int,

不过不是很确定,所以 Google 了型态转换的优先顺序,

发现原来 binary 是字串型态的一种,所以并不如我所想,而是字串和字串比对本来就不用转型成 int。

SELECT BINARY 20 = '20'  --1

BINARY 等同 CAST(str AS BINARY) 会将 int 转型成字串。

发现不小心自言自语了一大串。

/images/emoticon/emoticon16.gif


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章