cast是sql标准类型转换函数,语法为cast(expression as target_type),但各数据库对目标类型名、长度要求及错误处理差异显著:mysql用signed/unsigned而非int,postgresql要求varchar带长度,sql server对非法字符串转数字直接报错,而mysql静默返回0。

CAST 是 SQL 标准函数,几乎所有主流数据库(PostgreSQL、SQL Server、MySQL 8.0+、Oracle、SQLite)都支持,但行为细节有差异——直接写 CAST(column AS INT) 在 MySQL 5.7 或旧版 SQLite 中会报错,必须先确认你的数据库版本和目标类型是否被允许。
CAST 的基本语法和常见目标类型
标准写法是 CAST(expression AS target_type),其中 expression 可以是字段、字面量或表达式。target_type 不是所有数据库都用相同名称:比如想转整数,PostgreSQL 和 SQL Server 接受 INT,而 MySQL 更常用 SIGNED 或 UNSIGNED,Oracle 则要求写 NUMBER 或带精度的 NUMBER(10,2)。
- 字符串转数字:用
CAST('123' AS SIGNED)(MySQL),或CAST('123' AS INTEGER)(PostgreSQL) - 数字转字符串:统一用
CAST(42 AS CHAR),但 Oracle 要写CAST(42 AS VARCHAR2(10)) - 日期转换:MySQL 中
CAST('2023-01-01' AS DATE)可行;SQL Server 中若源是VARCHAR且格式不标准(如 '01/13/2023'),可能静默转成错误日期或报错
NULL 和非法值处理:不报错 ≠ 安全
CAST 遇到无法转换的内容时,不同数据库策略完全不同:CAST('abc' AS SIGNED) 在 MySQL 中返回 0,不报错也不警告;PostgreSQL 则直接抛出 invalid input syntax for integer 错误;SQL Server 默认也报错,除非你开了 ARITHABORT OFF 或用了 TRY_CAST。
- 生产环境别依赖隐式容错,尤其在清洗脏数据时
- 优先考虑
TRY_CAST(SQL Server)、SAFE_CAST(BigQuery)或加前置校验,例如 MySQL 用WHERE column REGEXP '^[0-9]+$'再 CAST - 注意空字符串:MySQL 把
''转SIGNED得0,PostgreSQL 报错
性能影响与替代方案
在 WHERE 或 JOIN 条件里对字段用 CAST(my_col AS CHAR),很可能让索引失效——因为优化器无法将索引 B-tree 值直接匹配转换后的结果。
- 如果经常按字符串形式查数字字段(如订单号
id字段要 like '123%'),不如建生成列或冗余字段存字符串格式,并为其建索引 - 聚合前转换(如
AVG(CAST(score AS DECIMAL(5,2))))一般无性能问题,但要注意精度截断:CAST(1.234 AS DECIMAL(3,1))结果是1.2,不是四舍五入 - 某些场景用隐式转换更简洁,比如
WHERE my_int_col = '123',数据库通常自动转,但显式 CAST 更可读、可控
最易被忽略的是类型长度声明:比如 CAST(x AS VARCHAR) 在 PostgreSQL 中默认长度是 1,不是无限长;SQL Server 的 CAST(x AS VARCHAR) 不带长度会取默认 30,超出就截断。写的时候务必带上长度,如 CAST(x AS VARCHAR(255))。











