iT邦幫忙

12

【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


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
Darwin Watterson
iT邦好手 1 級 ‧ 2018-07-11 17:49:50

真是有趣的問題, 今天長知識了 /images/emoticon/emoticon12.gif

暐翰 iT邦大師 1 級 ‧ 2018-07-11 17:51:43 檢舉

/images/emoticon/emoticon12.gif

6
純真的人
iT邦大師 1 級 ‧ 2018-07-11 22:46:00

我試這個方式可以@@判斷...加上binary

select * from transactions where binary id = "20xxx"; 
看更多先前的回應...收起先前的回應...

研究了一下 binary 的原理,

一開始以為因為 id 被轉型成二進制,
所以後面的字串才沒有被隱轉成 int,

不過不是很確定,所以 Google 了型態轉換的優先順序,

發現原來 binary 是字串型態的一種,所以並不如我所想,而是字串和字串比對本來就不用轉型成 int。

SELECT BINARY 20 = '20'  --1

BINARY 等同 CAST(str AS BINARY) 會將 int 轉型成字串。

發現不小心自言自語了一大串。

/images/emoticon/emoticon16.gif

fysh711426
哈~~我是突然想到到那篇~才來試試的~
資料庫之間"字母符號比較"測試

暐翰 iT邦大師 1 級 ‧ 2018-07-12 09:15:23 檢舉

太強了,我這邊把兩位大大的內容更新在文章結尾!

/images/emoticon/emoticon41.gif

1
神Q超人
iT邦研究生 5 級 ‧ 2018-07-12 09:04:58

雖然現在沒在用MySQL,
不過如果以後同事遇到就不會覺得驚訝了XD

我也沒有在用~~哈
只是有特別需要~才去查去資料XD

0
小魚
iT邦大師 1 級 ‧ 2018-07-12 12:11:15

第一次發現這件事,
不過我倒是不會去做數字跟字串比較這件事...

恩~因基本在傳值過來的時候~
就會先判斷值是否為數值資料了~(防呆+防攻擊)

1
石頭
iT邦高手 1 級 ‧ 2018-07-14 15:53:56

感謝 暐翰大分享
又獲得一個新知識^^/images/emoticon/emoticon41.gif

我要留言

立即登入留言