mysql 類型自動化轉換問題


mysql 類型自動化轉換問題

背景

有個業務需求,使用到find_in_set函數,簡單貼下,如下:

SELECT FIND_IN_SET('b','a,b,c,d'); //返回值為2,即第2個值
實際用法:
select * from campaign_plan where find_in_set('4',ad_type);

參考:https://www.cnblogs.com/mytzq/p/7090197.html

無意間發現了一個這樣的問題,ad _type為text類型,具體表數據如下:
image.png
執行了語句如下:
image.png
頓時三觀崩了,什么情況,怎么回匹配到第一個數字呢?

解惑

詢問了一個朋友,他給了一個方向,mysql會自動轉換類型,當你select語句的條件和數據中的type不一致的時候;
一拍大腿,是呀,之前有碰到過類似問題,如下:

有個id是varchar,你不加‘’也可以查詢出來, 應該是轉換了的,但這樣沒走索引的,所以查詢效率很低 。。

當時碰到的問題是,當數據是id='123', 你select是where id = 123,一個是int 一個是varchar,mysql會自動的'123'轉為123跟你的對比
回到,我上面碰到的問題也是類似,只是有一個逗號的存在,在轉換的時候會截斷,實際操作如下:

image.png

所以就解釋通了,三觀恢復

拿了一下官方的翻譯版本,
隱式類型轉換規則:

  • 如果一個或兩個參數都是NULL,比較的結果是NULL,除了NULL安全的<=>相等比較運算符。對於NULL <=> NULL,結果為true。不需要轉換
  • 如果比較操作中的兩個參數都是字符串,則將它們作為字符串進行比較。
  • 如果兩個參數都是整數,則將它們作為整數進行比較。
  • 如果不與數字進行比較,則將十六進制值視為二進制字符串
  • 如果其中一個參數是十進制值,則比較取決於另一個參數。 如果另一個參數是十進制或整數值,則將參數與十進制值進行比較,如果另一個參數是浮點值,則將參數與浮點值進行比較
  • 如果其中一個參數是TIMESTAMP或DATETIME列,另一個參數是常量,則在執行比較之前將常量轉換為時間戳。
  • 在所有其他情況下,參數都是作為浮點數(實數)比較的。

實際例子:

mysql> SELECT 1+'1';
        -> 2
mysql> SELECT CONCAT(2,' test');
        -> '2 test'
        
mysql> SELECT 1 > '6x';
        -> 0
mysql> SELECT 7 > '6x';
        -> 1
mysql> SELECT 0 > 'x6';
        -> 0
mysql> SELECT 0 = 'x6';
        -> 1

參考資料

https://zhuanlan.zhihu.com/p/30955365
https://dev.mysql.com/doc/refman/5.5/en/type-conversion.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM