cast函数是sql标准中用于显式类型转换的函数,基本语法为cast(expression as target_type),as关键字不可省略,支持主流数据库但目标类型写法存在差异,常用于数据清洗、跨系统交互及报表生成。

CAST函数的基本用法和语法结构
CAST 是 SQL 标准中用于显式类型转换的函数,所有主流数据库(PostgreSQL、SQL Server、MySQL 8.0+、Oracle、SQLite)都支持,但语法细节有差异。核心写法是 CAST(expression AS target_type),注意 AS 关键字不可省略,且目标类型写法因数据库而异。
- PostgreSQL 支持
CAST('123' AS INTEGER)或简写'123'::INTEGER,但后者非标准 - SQL Server 要求类型名带括号,如
CAST('2023-01-01' AS DATE),不能写成DATE - MySQL 8.0+ 允许
CAST('12.34' AS DECIMAL(5,2)),但旧版本不支持 DECIMAL 精度声明 - SQLite 的
CAST功能较弱,不支持日期类型转换,仅限于数值/文本/NULL 之间简单转换
常见转换失败场景及错误信息
类型不兼容或格式非法时,CAST 不会静默忽略,而是直接报错。比如把含字母的字符串转数字,或非法日期格式转 DATE,不同数据库抛出的错误信息不同,但本质一致。
- PostgreSQL 报
ERROR: invalid input syntax for type integer: "abc" - SQL Server 报
Msg 245, Level 16: Conversion failed when converting the varchar value 'xyz' to data type int. - MySQL 报
Truncated incorrect DOUBLE value: 'hello'(尤其在 WHERE 中隐式转换时更隐蔽) - 避免方式:先用
ISNUMERIC()(SQL Server)、REGEXP_LIKE()(Oracle/PostgreSQL)、或SAFE_CAST(BigQuery)预判;MySQL 可用CONVERT配合IF做兜底
CAST 和 CONVERT 的选择与性能差异
CAST 是 ANSI 标准,可移植性强;CONVERT 是 SQL Server 和 MySQL 的扩展函数,支持格式化(如日期样式),但跨库迁移时需重写。性能上两者无本质区别,底层都是类型解析,但频繁转换会影响执行计划——尤其是 WHERE 子句中对列使用 CAST(col AS VARCHAR),会导致索引失效。
- 优先用 CAST,除非需要格式化输出(如 SQL Server 的
CONVERT(VARCHAR, GETDATE(), 120)) - 避免在 WHERE 或 JOIN 条件中对字段做 CAST,应确保比较字段类型一致
- MySQL 中
CAST(col AS CHAR)比CONVERT(col USING utf8mb4)更明确,后者还涉及字符集转换逻辑
实际开发中最容易被忽略的细节
字符串转数字时,默认截断小数位而非四舍五入;日期字符串必须严格匹配数据库期望格式;还有隐式转换干扰 CAST 行为的问题——这些都不是语法错误,但结果常让人困惑。
-
CAST('12.78' AS INTEGER)在 PostgreSQL 和 SQL Server 中结果是12,不是13 -
CAST('01/32/2023' AS DATE)在 SQL Server 中报错,但在某些 MySQL 模式下可能转成0000-00-00(取决于 SQL_MODE) - 如果字段本身是
TEXT类型,CAST 到VARCHAR(10)可能被截断,且不报错——得靠业务逻辑校验长度 - JSON 字段(如 PostgreSQL 的
jsonb)不能直接 CAST 成标量类型,需先用->>'key'提取字符串再 CAST











