今天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 转型成字串。发现不小心自言自语了一大串。