首页/数据/SQL 速查/隐式类型转换让索引失效
性能与执行计划72 条

隐式类型转换让索引失效

字符串列与数字比较时,列被隐式转为数字:索引无法使用;把字面量改成与列同类型即可。

SQL 速查数据更新于 2026-10-12

示例

示例
-- phone 是 varchar:与数字比较导致列被转换,索引失效
SELECT * FROM users WHERE phone = 13800000000;

-- 修正:字面量加引号,与列类型一致
SELECT * FROM users WHERE phone = '13800000000';

-- JOIN 两侧类型不一致同样会转换,必要时显式 CAST
SELECT u.id
FROM users u
JOIN phones p ON p.no = u.phone;   -- 两列类型要一致
规则比较双方类型不一致时发生隐式转换;转换发生在列一侧则无法走索引
反向情形数字列与字符串字面量比较:字面量被转数字,索引通常仍可用
排查EXPLAIN 中 key 为 NULL、type=ALL 时核对列类型

易错点

  • 只给字面量加引号却不查 JOIN:连接列类型不一致同样触发转换,要两处都核对
  • 靠试错判断转换:先看表结构确认列类型,比反复试验更可靠

数据来源与参考

  • MySQL 8.0 Reference Manual · Type Conversion in Expression Evaluation
  • MySQL 8.0 Reference Manual §8.3.1 How MySQL Uses Indexes
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌