CAST()不是万能转换器,必须用MySQL官方支持的类型名(如SIGNED、CHAR、DATE),禁用INT等非标准名;传非法值会报错或返回不可靠结果(如0、NULL),且在WHERE/ORDER BY中易导致索引失效。

CAST() 不是万能胶,用错类型名、传非法值会直接报错,不是静默失败。
CAST() 的 type 参数只能写 MySQL 官方支持的类型名
写 INT 或 BOOLEAN 会报错,MySQL 不认这些别名。必须用 SIGNED(有符号整数)、UNSIGNED(无符号整数)、CHAR、DATE、DECIMAL(10,2) 等明确类型。
-
CAST('123' AS SIGNED)✅ 合法 -
CAST('123' AS INT)❌ 报错:Truncated incorrect INTEGER value -
CAST('2023-05-01' AS DATE)✅ 合法,但要求字符串格式严格匹配YYYY-MM-DD -
CAST('05/01/2023' AS DATE)❌ 返回NULL,不报错但结果不可靠
字符串转数字时,首字符决定行为
MySQL 会从左往右取连续数字字符,遇到非数字就停。空字符串、纯字母开头都转成 0,不是报错 —— 这容易被误判为“转换成功”。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
-
CAST(' 123abc' AS SIGNED)→123(跳过前导空格) -
CAST('abc123' AS SIGNED)→0(首字符非数字,截断失败) -
CAST('' AS SIGNED)→0(空字符串也得 0) -
CAST(NULL AS SIGNED)→NULL(保持 NULL,不变成 0)
在 WHERE 或 ORDER BY 中用 CAST 可能让索引失效
对字段本身做 CAST(),比如 WHERE CAST(phone AS CHAR) LIKE '138%',即使 phone 是 BIGINT 且有索引,MySQL 也无法使用该索引,会退化为全表扫描。
- 优先考虑数据清洗:把字符串字段改成合适类型,或加生成列并建索引
- 若必须用 CAST,尽量只对常量或计算表达式用,别套在索引字段上
-
ORDER BY CAST(score_text AS DECIMAL)同样危险,大表排序会明显变慢
CAST 和 CONVERT 选哪个?
功能重叠高,但关键差异很实际:
- 要转字符集(如
utf8mb4→gbk),必须用CONVERT(col USING gbk),CAST()不支持USING - 跨数据库迁移可能性高(比如将来切到 PostgreSQL),优先用
CAST(),它是 SQL 标准语法 -
CONVERT(expr, type)是旧式写法,容易和字符集转换混淆,建议统一用CONVERT(expr AS type)显式形式
最易被忽略的是隐式转换的“温柔陷阱”:看起来没报错,但 CAST('abc' AS SIGNED) 得 0、CAST('2023-02-30' AS DATE) 得 NULL,这些值在后续计算或 JOIN 中可能悄悄污染结果。真要用 CAST,先加条件过滤或用 REGEXP 校验格式。

















