日常的SQL数据处理中,数据类型转换几乎是避不开的环节,尤其是在跨系统交互时。无论是数据库开发、管理还是数据分析,搞懂数据类型转换的机制,对写出高效、稳定的SQL代码来说,是基本功中的基本功。市面上转换函数不少,但说到最通用、最基础的,还得是CAST。

一、概述
1.1 CAST 函数是什么
工作中你可能会遇到各种奇怪格式的数据:用户输入的是字符串,数据库里得存成数值或日期;做数据查询时,字符串格式的销售金额要用来计算求和或平均值,也得先转成数值。这些现实场景,都绕不开数据类型转换。
而CAST函数,就是为了应对这些场面而生的。它堪称数据类型转换领域的瑞士军刀——作为SQL标准函数,能把一个数据类型的值转换成另一个,既搞定数值与字符之间的“跨界矛盾”,也能处理日期格式的“时空错乱”。无论是字符串转数字,还是浮点数转整数,它都能上阵。
1.2 CAST 函数的基本语法
语法很直接:
CAST(expression AS data_type)
| 参数 | 简要说明 |
|---|---|
| expression | 要转换的原始表达式 |
| AS | 分隔符,前面是要处理的数据,后面是目标数据类型。 |
| data_type | 目标数据类型,不同数据库支持的类型会有差异,使用时需要留意。 |
| 类型 | 简要说明 | 格式 |
|---|---|---|
| DATE | 将 value 转化为 DATE 类型 | YYYY-MM-DD |
| DATETIME | 将 value 转化为 DATETIME 类型 | YYYY-MM-DD HH:MM:SS |
| DECIMAL[(M[,D])] | 将 value 转化为 DECIMAL 类型。M和D参数可指定最大位数和小数位数。 | |
| TIME | 将 value 转化为 TIME 类型 | HH:MM:SS |
| CHAR | 将 value 转化为 CHAR 类型 (固定长度的字符串) | |
| NCHAR | 将 value 转化为 NCHAR | |
| SIGNED | 将 value 转化为 SIGNED (有符号的 64 位整数) | |
| UNSIGNED | 将 value 转化为 UNSIGNED (无符号 64 位整数) | |
| BINARY | 将 value 转化为 BINARY (二进制字符串) | |
| DOUBLE | 将 value 转化为 DOUBLE 类型 | |
| FLOAT | 将 value 转化为 FLOAT 类型 |
看个例子。如果你手头有个字符串 '2026-01-23',想把它变成日期类型,这样写就行:
SELECT CAST('2023-01-01' AS DATE)这在处理原始数据不是标准格式时尤其管用,比如从文本文件导入数据后,经常发现字段类型对不上,就需要用 CAST 做转换。语法简单直接,但使用过程中有一些细节不能忽视,尤其是不同类型之间的转换规则。如果转换失败——比如试图把 'ABC' 变成整数,大多数数据库会直接报错。所以动手之前,最好先确认一下数据是否能安全转换。
二、CAST 的实战场景
CAST 在日常开发中的应用场景很广,主要可以归纳为以下几种。
2.1 数据类型转换
最常见的用法就是把字符串字段转成数字来计算。比如:
# 字符串转整数SELECT CAST('123' AS SIGNED);# 字符串转浮点型数字SELECT CAST('123.456' AS FLOAT);2.2 字符串转换
反过来,把其他类型转成字符串也很常用:
# 将当前时间转换成字符串类型SELECT CAST(NOW() AS CHAR);# 整数转字符串SELECT CAST(123 AS CHAR);# 浮点数转字符串SELECT CAST(123.456 AS CHAR);
做字符串转换时,有一点需要特别留意:目标数据类型的长度限制。如果转换后的字符串过长,可能会被截断,甚至报错。这种情况下,可以用 LEFT 函数来截取指定长度的子字符串:
SELECT LEFT(CAST('He1lo,World' AS CHAR(5)), 5);另外,不同数据库对数据类型的写法会有差异。比如 MySQL 里用 CHAR 或 VARCHAR,SQL Server 则常用 NVARCHAR。跨数据库迁移时,这个细节很容易踩坑。
2.3 日期时间转换
日期格式千变万化,有时候需要把日期转成特定格式才能满足业务需求。CAST 可以帮你把字符串或时间戳转成 DATE、TIME、DATETIME 等类型:
# 将值转换为TIME数据类型SELECT CAST(NOW() AS time);SELECT CAST('2026-01-25' AS time);SELECT CAST('2026-01-25 10:30:00' AS time);# 将值转换为DATE数据类型SELECT CAST(NOW() AS date);SELECT CAST('2026-01-25' AS date);SELECT CAST('2026-01-25 10:30:00' AS date);# 将值转换为DATETIME数据类型SELECT CAST(NOW() AS datetime);SELECT CAST('2026-01-25' AS datetime);SELECT CAST('2026-01-25 10:30:00' AS datetime);2.4 数值与字符的“变形记”
-- 字符串转整数SELECT CAST('123' AS INTEGER) AS string_to_int;-- 字符串转小数(指定精度)SELECT CAST('123.45' AS DECIMAL(5,2)) AS string_to_decimal;-- 科学计数法字符串转浮点SELECT CAST('1.23E+5' AS FLOAT) AS scientific_to_float;-- 带货币符号字符串转数值(需数据库支持)SELECT CAST('$123.45' AS DECIMAL(10,2)) AS currency_to_decimal;当字段存储的是字符串类型的数值时,直接用 ORDER BY 排序会按字典序来排,结果很容易跑偏。比如 '100' 会被排在 '99' 之前,因为字符'1'小于'9'。这时候就得用 CAST 转成数字再排序。
SELECT CAST(123.456 AS DECIMAL(10, 2));
从日志或别的系统拿到的数据,经常是 '100' 这样的字符串,但实际要用来做加减乘除,那就得转成数字类型:
SELECT CAST('100' AS SIGNED)如果字符串里混入了非数字字符,比如 '100元',转换就会报错。所以稳妥的做法是,在转换前先用 TRIM() 或正则表达式过滤掉非数字部分。
三、避坑指南
3.1 空字符陷阱
不同数据库对空字符的处理态度不一样。比如 CAST('' AS DATE),MySQL 直接报错,PostgreSQL 返回无效日期错误,Oracle 也会抛出异常。建议先用 CASE WHEN 过滤空值,或者用 COALESCE(NULLIF(column,''), '默认值') 做预处理,会安全很多。
3.2 精度丢失
把 DECIMAL 转成 INT 时,系统会直接截断小数部分,不会四舍五入。如果想要更精确的结果,最好先用 ROUND() 或 CEILING() 处理一下,再执行转换。
四、总结
CAST 函数是做数据处理和转换时离不开的工具,尤其是数据导入和报告生成这类场景,它能帮我们确保数据类型的正确性和一致性。虽然看起来简单,但用好它,需要理解不同数据库的差异和潜在的一些陷阱。掌握了这些,你写出来的 SQL 代码自然会更加可靠、高效。
