首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 字串隱式轉換導致查詢異常的根因分析

     編輯:MySQL 綜合教學

問題重現


CREATE TABLE ceshi (id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    title VARCHAR(1000) NOT NULL DEFAULT '0', PRIMARY KEY(id));

INSERT INTO ceshi(title) VALUES('你好啊'), ('hello'), ('0'), ('1');

-- 查詢 1:數字 0 比較
SELECT * FROM ceshi WHERE title = 0;
-- 結果:id=1('你好啊'), 2('hello'), 3('0')  ← 3 筆!

-- 查詢 2:字串 '0' 比較
SELECT * FROM ceshi WHERE title = '0';
-- 結果:id=3('0')  ← 1 筆

根因分析

欄位是 VARCHAR,比較值是數字 0 → MySQL 將欄位值隱式轉換為 INT 再比較

  • 文字/字母/中文 → 轉 INT = 0
  • 純數字字串 '0' → 轉 INT = 0
  • 純數字字串 '1' → 轉 INT = 1

因此 title = 0 條件下,除 '1' 外全符合。

為何不轉換常數?

常數 0 代表使用者「本意」是數值比較。若常數也被轉換,程式行為將難以預測。使用 0 vs '0' 由開發者決定比較語意。

最佳實踐

  • 永遠確保比較雙方類型一致:字串比字串,數字比數字
  • WHERE 條件中字串值必須加引號
  • 必要時使用 CAST() 明確轉換
  • 啟用 sql_mode=STRICT_TRANS_TABLES 可減少隱式轉換

驗證轉換行為


SELECT CAST('你好啊' AS UNSIGNED);  -- 0
SELECT CAST('hello' AS UNSIGNED);   -- 0
SELECT CAST('0' AS UNSIGNED);       -- 0
SELECT CAST('1' AS UNSIGNED);       -- 1
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved