首页/数据/数据库速查/隐式类型转换与索引失效
本包目录(495 条)
MySQL 基础与连接36 条
SQL 语法52 条
用户与权限21 条备份与恢复56 条主从复制与高可用53 条性能与调优57 条Redis 命令96 条Redis 运维与场景124 条

隐式类型转换与索引失效

字符串列与数字比较、字符集不同的连接列都会触发隐式转换:既可能扫全表又可能拿到错误结果,是慢 SQL 的隐蔽来源。

数据库速查数据更新于 2026-10-12
用途识别与规避隐式转换
典型varchar 列 = 数字、utf8 与 utf8mb4 连接
检测EXPLAIN 的 type=ALL + 告警

错误与正确写法

错误与正确写法
-- 差:phone 是 varchar,与数字比较触发转换
SELECT * FROM users WHERE phone = 13800138000;
-- 好:保持同类型
SELECT * FROM users WHERE phone = '13800138000';

-- 字符集不一致的连接同样禁用索引
-- 统一改用一致字符集或显式 CONVERT
EXPLAIN 看到 type=ALL 且 filtered=100 时,检查条件值类型是否与列一致;字符集不一致还会在 SHOW WARNINGS 里给出提示。

易错点

  • 字符串转数字会出现 '123abc' 匹配 123 的宽松匹配,数据正确性风险比性能更严重
  • JOIN 两表字符集不同时索引直接失效,先在 DDL 层面统一

数据来源与参考

  • MySQL 8.0 Reference Manual: Type Conversion in Expression Evaluation

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌