MySQL隱式轉換陷阱:從錯誤查詢案例解析索引失效與數據類型匹配

開始之前,先問個問題問題:mysql 數據類型是date ,怎么寫查詢條件索引有效?
——下面帶著疑問看下去。

一、mysql-8.隱式轉換導致索引失效或查出不符合where條件結果

今天在執行一條sql語句時候,where條件寫錯了,但是居然查詢出來了結果。
如下圖所示:
在這里插入圖片描述
第一反映是,mysql的優化器是不是做了什么操作,導致最后查詢條件不是現在的72071003dsss,而是變成了其它的值。因為之前在一篇文章看過,如果where條件兩邊一邊是數值類型,一邊是字符型mysql會做隱式轉換,但是具體是怎么轉換的,我就不是很了解。所以就先朝這個方向去查找結果。

首先去看下表結構,user_id字段果然是int類型,和查詢條件72071003dsss不是同一個類型。

通過查詢官方文檔得到一個答案:(對于今天問題的探討,重點請看最后一條)

當操作符與不同類型的操作數一起使用時,會發生類型轉換以使操作數兼容。某些轉換是隱式發生的。

  • 如果一個或兩個參數均為NULL,則比較的結果為NULL,但NULL-safe <=> 相等> 比較運算符除外。對于NULL <=> NULL,結果為true。無需轉換。
  • 如果比較操作中的兩個參數都是字符串,則將它們作為字符串進行比較。
  • 如果兩個參數都是整數,則將它們作為整數進行比較。
  • 如果不與數字比較,則將十六進制值視為二進制字符串。
  • 如果參數之一是a TIMESTAMP或 DATETIMEcolumn,而另一個參數是常量,則在執行比較之前,該常量將轉換為時間戳。這樣做是為了使ODBC更友好。對于的參數,此操作未完成 IN()。為了安全起見,在進行比較時請始終使用完整的日期時間,日期或時間字符串。例如,要在BETWEEN與日期或時間值一起使用時獲得最佳結果 ,請使用CAST()將值顯式轉換為所需的數據類型。
  • 一個或多個表中的單行子查詢不被視為常量。例如,如果子查詢返回要與DATETIME 值進行比較的整數,則比較將作為兩個整數進行。整數不轉換為時間值。要將操作數作為DATETIME值進行比較 ,請使用 CAST()將子查詢值顯式轉換為DATETIME。
  • 如果參數之一是十進制值,則比較取決于另一個參數。如果另一個參數是十進制或整數值,則將參數作為十進制值進行比較;如果另一個參數是浮點值,則將參數作為浮點值進行比較。

在所有其他情況下,將參數作為浮點數(實數)進行比較。例如,將字符串和數字操作數進行比較,將其作為浮點數的比較。

1.1 隱式轉換導致查詢出不符合where條件的結果

如果查詢條件的由字符轉為浮點時候,又是什么樣的轉換規則呢?

  • 不以數字開頭的字符串都將轉換為0。如‘abc’、‘a123bc’、‘abc123’都會轉化為0;
  • 以數字開頭的字符串轉換時會進行截取,從第一個字符截取到第一個非數字內容為止。比如‘123abc’會轉換為123‘012abc’會轉換為012也就是125.3a66b78c’會轉換為5.3,其他同理。

所以我們文章開始貼出來的sql:

SELECT * FROM A WHERE config_name='test111' AND user_id ='72071003dsss'

查詢條件’72071003dsss’被轉換成了72071003,那么最后的查詢語句就是:

SELECT * FROM A WHERE config_name='test111' AND user_id ='72071003'

結果: 由于觸發隱式轉換,將我們的字符型查詢條件按照一定規則轉換成了浮點性,變成了另一個值,而剛好這另一個值有匹配的結果。這就是為什么查詢出了不符合where條件的結果原因。

1.2 隱式轉換導致索引失效

  • 當操作符左右兩邊的數據類型不一致時,會發生隱式轉換。
  • 當where查詢操作符左邊為數值類型時發生了隱式轉換,那么對效率影響不大,但還是不推薦這么做。

select* from test1 where int_column= ‘10000’
對于這條sql的 int_column字段是整型左邊為int類型10000,轉換為浮點數還是10000,右邊字符串類型’10000’,轉換為浮點數也是10000。兩邊的轉換結果都是唯一確定的,所以不影響使用索引。

  • 當where查詢操作符左邊為字符類型時發生了隱式轉換,那么會導致索引失效,造成全表掃描效率極低。

sselect* from test1 where str_column= 10000,

對于這條sql str_column是字符型左邊是字符串類型’10000’,轉浮點數為10000是唯一的,右邊int類型10000轉換結果也是唯一的。
但是,因為左邊是檢索條件,'10000’轉到10000雖然是唯一,但是其他字符串也可以轉換為10000,比如’10000a’,‘010000’,'10000’等等都能轉為浮點數10000,這樣的情況下,是不能用到索引的。

tips:隱式轉換有可能會導致索引失效,這個我們工作中需要注意的。當where查詢操作符左邊為字符類型時發生了隱式轉換,那么會導致索引失效,造成全表掃描效率極低。

上面便解答了文章開始最初的問題。接下來,我們來回到date類型的總結。

二、問題:mysql 數據類型是date ,怎么寫查詢條件索引有效?

2.1 走索引的方式:

  1. 直接范圍比較:
WHERE date_column >= '2025-07-01' AND date_column <= '2025-07-31'

使用比較運算符(>=/<=)直接匹配DATE類型,數據類型一致,可觸發索引?。

2?. BETWEEN操作符

WHERE date_column BETWEEN '2025-07-01' AND '2025-07-31'

功能等效于范圍比較,同樣支持索引優化?。

  1. 精確日期匹配
WHERE date_column = '2025-07-29'

等值查詢時,若數據類型完全匹配(DATE=DATE),可走索引?。

2.2 不會走索引的寫法

  1. 使用日期函數,這種顯式轉換
WHERE DATE(date_column) = '2025-07-29'WHERE MONTH(date_column)=7WHERE DATE_FORMAT(date_column, '%Y-%m')='2025-07'

函數轉換會使索引失效,導致全表掃描?

  1. 類型不一致的查詢,這種隱式轉換
WHERE date_column = 20250729INT vs DATE

數據類型不匹配時,有可能無法走索引。隱式轉換不一定必然導致索引失效,看情況

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91759.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91759.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91759.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【sklearn(01)】數據集加載、劃分,csv文件創建,特征工程,無量綱化

目錄sklearn數據集玩具數據集現實世界數據集加載玩具數據集獲取現實世界數據集本地csv數據創建csv文件pandas加載csv數據集劃分特征工程步驟特征工程APIDictVectorizer 字典列表特征提取APICountVectorizer 文本特征提取API英文文本提取中文文本提取TfidfVectorizer TF-IDF文本…

docker desktop入門(docker桌面版)(提示wsl版本太低解決辦法)

參考文章&#xff1a;Docker Desktop Engine Stopped原因分析&#xff08;docker桌面停止&#xff09;WSL沒裝或沒更新 文章目錄Docker Desktop入門指南1. Docker Desktop簡介2. 安裝Docker Desktop2.1 系統要求2.2 下載和安裝3. 配置Docker Desktop修改默認存儲路徑4. 運行你的…

《n8n基礎教學》第三節:模擬一個自動化場景

1、模擬場景Nathan &#x1f64b;是 ABCorp 的分析經理&#xff0c;他的工作是支持 ABCorp 團隊的報告和分析。作為一個真正的多面手&#xff0c;他還負責處理一些雜項任務。Nathan 做的一些事情是重復且枯燥的。他希望自動化其中一些任務&#xff0c;以避免精疲力竭。作為一名…

CodeRush AI 助手進駐 Visual Studio:AiGen/AiFind 亮相(三)

CodeRush 是專為 Visual Studio 打造的高效開發插件&#xff0c;通過集成 AI 驅動功能&#xff08;如自然語言生成代碼的 AiGen 和智能搜索邏輯的 AiFind&#xff09;、語音交互及深度重構工具&#xff0c;直接在 IDE 內無縫完成代碼生成、修改與導航&#xff0c;消除窗口切換與…

如何從頭開始搭建屬于自己的家用nas實現內網穿透訪問

最近我在家部署了群暉NAS923&#xff0c;從而實現內網穿透&#xff0c;下面寫一個新手向教程&#xff1a; 一、硬件安裝與初始化設置 1. 硬盤安裝&#xff08;已完成可跳過&#xff09; 群暉 923 支持 4 塊 3.5 英寸硬盤&#xff0c;開箱后取出硬盤架&#xff0c;將硬盤&am…

mysql 之多表

mysql之多表已知2張基本表&#xff1a;部門表&#xff1a;dept &#xff08;部門號&#xff0c;部門名稱&#xff09;;員工表 emp&#xff08;員工號&#xff0c;員工姓名&#xff0c;年齡&#xff0c;入職時間&#xff0c;收入&#xff0c;部門號&#xff09;CREATE table dep…

【Django】-6- 登錄用戶身份鑒權

一、&#x1f6e1;? Django 鑒權 & 登錄控制 Django 自帶的鑒權系統&#xff08;用戶身份管理小管家&#xff09;鑒權系統能干啥&#xff1f;Django 自帶的鑒權系統&#xff0c;就像一個 “用戶身份管家” &#xff0c;幫你管好這些事兒&#xff1a;功能類比加密存儲用戶密…

winscp 連openwrt 返回127錯誤碼

winscp 連openwrt 24.10返回127錯誤碼。找了許多原因也沒搞清為啥&#xff08;客戶端加密方式、winscp版本過低等都試過&#xff09;&#xff0c;用SecureFx試了一下&#xff0c;發現是openwrt 24.10固件沒有安裝Sftp服器&#xff0c;用下列命令安裝即可。opkg install openssh…

Python編程基礎與實踐:Python文件處理入門

Python文件處理實戰 學習目標 通過本課程的學習&#xff0c;學員將掌握如何在Python中打開、讀取、寫入和關閉文件&#xff0c;了解文本文件和二進制文件的區別&#xff0c;以及在文件處理中的一些最佳實踐。 相關知識點 Python文件處理 學習內容 1 Python文件處理 1.1 文件的基…

Corrosion2靶機

打開靶機信息收集&#xff1a;kali里使用arp-scan -l或者netdiscover發現主機使用nmap掃描端口nmap -sS -sV -T4 -n -p- 192.168.31.20開啟了22、80、8080端口 8080發現開啟了tomcat服務掃出了他的ip以及他開放的端口&#xff0c;我們接下來拿瀏覽器訪問一下兩個頁面都沒有什么…

編程與數學 03-002 計算機網絡 18_物聯網與網絡

編程與數學 03-002 計算機網絡 18_物聯網與網絡一、物聯網的基本概念&#xff08;一&#xff09;物聯網的架構與層次&#xff08;二&#xff09;物聯網的關鍵技術二、物聯網網絡的構建&#xff08;一&#xff09;物聯網網絡的通信協議&#xff08;二&#xff09;物聯網網絡的拓…

【Kubernetes】ConfigMap配置管理:存儲配置參數,創建到容器掛載

在Kubernetes中&#xff0c;配置管理是應用部署的重要環節。ConfigMap作為存儲非敏感配置數據的資源對象&#xff0c;能幫助我們實現"配置與代碼分離"&#xff0c;讓應用部署更靈活。一、什么是ConfigMap&#xff1f; ConfigMap是Kubernetes中用于存儲非加密配置數據…

Promise和回調地獄

順序執行 vs. 異步操作&#xff1a; 當我們說“順序執行”&#xff0c;通常是指 操作按順序發生。而 異步操作 指的是操作在后臺執行&#xff0c;不會阻塞其他操作&#xff0c;通常會使用回調、Promise 或 async/await 來處理結果。 在 Promise 鏈式調用 的情況下&#xff0c;雖…

LeetCode 65:有效數字

LeetCode 65&#xff1a;有效數字問題本質與挑戰 需判斷字符串是否為有效數字&#xff0c;規則涉及整數、小數、指數&#xff08;e/E&#xff09;的復雜組合&#xff0c;如&#xff1a; 整數&#xff1a;123、-45、678小數&#xff1a;1.2、.3、4.、5.6指數&#xff1a;1e10、2…

數據結構之順序表應用與雙指針法

元素刪除通過元素移動的方式來模擬刪除操作&#xff1a;將指定下標后的所有元素依次向前移動一位&#xff0c;覆蓋要刪除的元素&#xff0c;從而達到 "刪除" 的效果。 通過自定義函數實現刪除功能&#xff0c;需要傳入數組、數組長度的指針&#xff08;因為要修改長度…

Python編程基礎與實踐:Python基礎數據類型入門

Python變量與數據類型實踐 學習目標 通過本課程的學習&#xff0c;學員可以掌握Python中變量的基本概念&#xff0c;了解并能夠使用Python的基本數據類型&#xff0c;包括整型、浮點型、字符串和布爾值。此外&#xff0c;學員還將學習如何在實際編程中聲明和使用這些數據類型。…

深入解析C/C++函數變量傳遞:棧、堆與全局變量的生命周期之旅

資料合集下載鏈接: ?https://pan.quark.cn/s/472bbdfcd014? 在編程學習中,函數是構建程序的基石,而理解變量如何在函數之間正確、安全地傳遞,則是從入門到進階的關鍵一步。我們經常會遇到這樣的困惑:為什么一個指針在某個函數里工作正常,傳遞給另一個函數后卻變成了“…

Ubuntu18網絡連接不上也ping不通網絡配置問題排查與解決方法

Ubuntu 18啟動以后發現連接不上網絡,執行 ip a命令或者ifconfig都顯示不了正確的地址(192.168.xxx.xxx)。 剛裝好系統是沒問題的,打算使用FTP開啟ftp服務與windows互傳文件,安裝了net-tools插件就突然連不上網絡了,懷疑是網絡配置被修改了。 經過了一段時間折騰終于解決了,…

【計算機網絡】Socket網絡編程

目錄 一、主機字節序列和網絡字節序列 二、套接字地址結構 1、IPv4 地址結構 (sockaddr_in) 2、IPv6 地址結構 (sockaddr_in6) 3、通用套接字地址結構 (sockaddr) 4、Unix域套接字地址結構 (sockaddr_un) 5、專用 socket 地址結構 6、套接字地址結構的轉換 字符串轉二進制地址 …

網頁操作自動化解決方案:如何用Browser-Use+CPolar提升企業運營效率

文章目錄前言1. 安裝Ollama2. Gemma3模型安裝與運行3. 虛擬環境準備3.1 安裝Python3.2. 安裝conda4. 本地部署Brower Use WebUI4.1 創建一個新conda環境4.2 克隆存儲庫4.3 安裝依賴環境4.4 安裝瀏覽器自動化工具4.5 修改配置信息5. 本地運行測試6. 安裝內網穿透6.1 配置公網地址…