SQL CAST 与 CONVERT 类型转换方法实战

2次阅读

cast是标准sql数据库通用类型转换函数,语法为cast(表达式 as 目标类型),不支持格式化且失败报错;convert是sql server特有函数,支持样式码实现日期数字格式化,但不可移植。

SQL CAST 与 CONVERT 类型转换方法实战

SQL 中的 CASTCONVERT 都用于数据类型转换,功能相似但语法和兼容性有区别。掌握它们的用法、差异和典型场景,能避免报错、提升查询健壮性。

CAST:标准 SQL 语法,跨数据库通用

语法简洁,ANSI 标准,主流数据库(postgresqlmysql 8.0+、SQL Server、oracle)均支持。

  • 格式固定:CAST(表达式 AS 目标类型),例如 CAST('2023-10-05' AS date)
  • 不支持格式化(如日期转字符串时指定 ‘yyyy-MM-dd’),仅做类型映射
  • 转换失败会直接报错(如 CAST('abc' AS int)),建议配合 TRY_CAST(SQL Server/PostgreSQL)或条件判断使用
  • 适合写可移植 SQL,尤其在多数据库环境或 ORM 动态生成语句时更安全

CONVERT:SQL Server 特有,支持格式化参数

SQL Server 专属函数,语法更灵活,尤其擅长日期/数字格式控制。

  • 基本用法:CONVERT(目标类型, 表达式),等价于 CAST,如 CONVERT(DATE, '2023-10-05')
  • 关键优势:支持第三个参数——样式码(style),用于格式化日期或数字,例如:
    CONVERT(VARCHAR, GETDATE(), 120)'2023-10-05 14:30:22'
    CONVERT(VARCHAR, 12345.67, 1)'12,345.67'
  • 注意:样式码仅对特定类型生效(如 DATE、DATETIME、MONEY),且不同版本支持略有差异
  • 不可移植到 MySQL 或 PostgreSQL,纯 SQL Server 项目中可优先考虑

什么时候该选 CAST?什么时候用 CONVERT?

核心看需求是否涉及“格式控制”与“环境约束”:

  • 需要把 INT 转成 VARCHAR 且不关心千分位或小数位 → 用 CAST 更清晰直接
  • 要把 DATETIME 转成带中文年月日的字符串(如‘2023年10月05日’)→ SQL Server 中可用 CONVERT + 样式码,或拼接 format()(但性能略低)
  • 写视图或存储过程供多个数据库调用 → 必须用 CAST,避免语法报错
  • 处理用户输入的字符串转数值,可能含空格或异常值 → 先用 TRIM() 清理,再用 TRY_CAST(SQL Server)或 SAFE_CAST(BigQuery)捕获失败,而非硬转

常见坑与避坑建议

类型转换看着简单,实际容易引发隐式转换、截断、时区或精度丢失问题:

  • CAST('123.456' AS DECIMAL(5,2)) 会四舍五入为 123.46,不是截断;若目标精度不够(如 DECIMAL(4,2)),则报错
  • CONVERT(VARCHAR, 0xABCDEF) 默认转成十六进制字符串 '0xABCDEF',但加样式码 1 可得 'abcdef'(小写无前缀)
  • 日期字符串未带时间部分时,CAST('2023-10-05' AS DATETIME) 在 SQL Server 中默认补为 '2023-10-05 00:00:00.000',而某些旧版客户端可能按本地时区解释
  • 避免在 WHERE 条件中对字段用 CAST/CONVERT(如 WHERE CAST(order_date AS DATE) = '2023-10-05'),会导致索引失效;应改写为范围查询:WHERE order_date >= '2023-10-05' AND order_date
text=ZqhQzanResources