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 再比較
因此 title = 0 條件下,除 '1' 外全符合。
常數 0 代表使用者「本意」是數值比較。若常數也被轉換,程式行為將難以預測。使用 0 vs '0' 由開發者決定比較語意。
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