Mysql隱式類型轉(zhuǎn)換方式
一、實例操作
如下圖user表結(jié)構(gòu)

查詢語句1
![]()
- 執(zhí)行結(jié)果:
![]()
查詢語句2
![]()
- 執(zhí)行結(jié)果:
![]()
查詢語句3
![]()
- 執(zhí)行結(jié)果:
![]()
查詢語句4
![]()
- 執(zhí)行結(jié)果:
![]()
- 結(jié)果分析:
從上面四則查詢語句中可以看出 mobile的字段為字符類型時,當(dāng)查詢時等式是字符類型和數(shù)字類型時執(zhí)行結(jié)果不一致,而status的字段為數(shù)字類型,當(dāng)查詢時等式是字符類型和數(shù)字類型時執(zhí)行結(jié)果一致。
這是為什么呢?
二、mysql 隱式類型轉(zhuǎn)換
上述案例其真實的原因時mysql的隱式類型轉(zhuǎn)換,那什么是隱式類型轉(zhuǎn)換呢?
1. 隱式類型轉(zhuǎn)換規(guī)則
- 如果一個或兩個參數(shù)均為NULL,則比較的結(jié)果為NULL,除了 相等比較運(yùn)算符。對于NULL NULL,結(jié)果為true。
- 如果比較操作中的兩個參數(shù)都是字符串,則將它們作為字符串進(jìn)行比較。
- 如果兩個參數(shù)都是整數(shù),則將它們作為整數(shù)進(jìn)行比較。
- 如果不與數(shù)字比較,則將十六進(jìn)制值視為二進(jìn)制字符串。
- 如果參數(shù)之一是 timestamp 或 datatime column,而另一個參數(shù)是常量,則在執(zhí)行比較之前,該常量將轉(zhuǎn)換為時間戳。
- 如果參數(shù)之一是十進(jìn)制值,則比較取決于另一個參數(shù)。如果另一個參數(shù)是十進(jìn)制或整數(shù)值,則將參數(shù)作為十進(jìn)制值進(jìn)行比較;如果另一個參數(shù)是浮點(diǎn)值,則將參數(shù)作為浮點(diǎn)值進(jìn)行比較。
- 在所有其他情況下,將參數(shù)作為浮點(diǎn)數(shù)(實數(shù))進(jìn)行比較。例如,將字符串和數(shù)字操作數(shù)進(jìn)行比較,將其作為浮點(diǎn)數(shù)的比較。
通過隱式類型轉(zhuǎn)換可以得出上述示例的結(jié)果:當(dāng)查詢中有數(shù)字時那么會將字符串轉(zhuǎn)化成數(shù)字進(jìn)行比較。
所以當(dāng)你的列為字符串時那么需要將列中字符串進(jìn)行類型格式轉(zhuǎn)換而進(jìn)行字符格式轉(zhuǎn)換之后則與索引不一致;
當(dāng)你的列為數(shù)字時查詢等式為字符串時只是把查詢的常量轉(zhuǎn)成數(shù)字并不影響列的類型所以依然可以使用索引并沒有破壞索引的類型。
2. 隱式類型轉(zhuǎn)換實例
![]()

3. 避免隱式類型轉(zhuǎn)換
可以使用內(nèi)置函數(shù)對類型強(qiáng)制性轉(zhuǎn)換
- case( value as type)
- conver(value,type)
我們需要充分了解嗎MySQL里隱式類型轉(zhuǎn)換的規(guī)則,同時我們?nèi)粘T趯慡QL時一定要檢查參數(shù)類型與數(shù)據(jù)庫字段類型是否一致,否則可能造成隱式類型轉(zhuǎn)換,不能正常應(yīng)用索引,造成慢查詢,甚至拖垮整個數(shù)據(jù)庫服務(wù)集群。
如果參數(shù)不一致,也可以考慮使用CAST函數(shù)顯性轉(zhuǎn)換成一致類型。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL/Postgrsql 詳細(xì)講解如何用ODBC接口訪問MySQL指南
2008-01-01
Linux連接mysql報錯:Access denied for user ‘root’@‘localhost’(usi
這篇文章主要給大家介紹了關(guān)于Linux連接mysql數(shù)據(jù)庫報錯:Access denied for user ’root‘@’localhost‘(using password: YES)的解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01
MySQL系統(tǒng)庫之information_schema的實現(xiàn)
information_schema用于存儲數(shù)據(jù)庫元數(shù)據(jù),本文主要介紹了MySQL系統(tǒng)庫之information_schema的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-11-11
SQL查詢之字段是逗號分隔開的數(shù)組如何查詢匹配數(shù)據(jù)問題
這篇文章主要介紹了SQL查詢之字段是逗號分隔開的數(shù)組如何查詢匹配數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
MySQL請求處理全流程之如何從SQL語句到數(shù)據(jù)返回
這篇文章主要介紹了MySQL請求處理全流程之如何從SQL語句到數(shù)據(jù)返回,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2025-03-03
Mysql 5.6使用配置文件my.ini來設(shè)置長時間連接數(shù)據(jù)庫的問題
這篇文章主要介紹了Mysql 5.6使用配置文件my.ini來設(shè)置長時間連接數(shù)據(jù)庫,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07

