优先用cast,因其符合ansi标准、跨库兼容性好;仅当需用style参数格式化日期或浮点数输出时选convert。

CAST 和 CONVERT 在 SQL Server 里怎么选
优先用 CAST,除非你需要控制浮点数格式或兼容旧代码。两者功能基本等价,但 CAST 是 ANSI 标准,跨库迁移更稳;CONVERT 是 SQL Server 特有,多一个 style 参数,对 float 转字符串能略作干预(比如 style = 0 控制位数),但依然无法彻底禁用科学计数法。
-
CAST(123456789.12 AS VARCHAR(20))→ 可能得'1.23457e+08' -
CONVERT(VARCHAR(20), 123456789.12, 0)→ 同样可能走科学计数法,只是默认最多显示 6 位有效数字 - 真要避免科学计数法,必须先转精确类型:
CAST(CAST(123456789.12 AS DECIMAL(15,2)) AS VARCHAR(20))
MySQL 里别用 + '' 隐式拼接做转换
虽然 123 + '' 看似简洁,但它依赖隐式转换规则,且在严格模式(STRICT_TRANS_TABLES)下可能报错;更糟的是,它会把 NULL 变成空字符串,掩盖数据缺失问题。
-
SELECT 123 + ''→'123',但SELECT NULL + ''→''(不是NULL) - 正确做法是显式用
CAST(NULL AS CHAR)或CONVERT(NULL, CHAR),结果仍是NULL - 如果字段含空格或空串,
CAST(' ' AS INT)在 MySQL 会转成0,而 SQL Server 直接报错,行为不一致
PostgreSQL 和 Oracle 的关键差异点
PostgreSQL 对 TEXT 类型最友好,CAST(123.45 AS TEXT) 安全、无需长度;Oracle 则不支持 TEXT,必须用 VARCHAR2,且长度不能省略——漏写 (20) 会报错。
- PostgreSQL:
CAST(123 AS TEXT)✅,CAST(123 AS VARCHAR)❌(缺长度) - Oracle:
CAST(123 AS VARCHAR2(10))✅,CAST(123 AS VARCHAR2)❌(语法错误) - MySQL:
CAST(123 AS CHAR)✅(长度可选),但CAST(123.45 AS CHAR)❌(必须带长度)
浮点数转字符串时最容易被忽略的坑
不是“能不能转”,而是“转出来是不是你想要的样子”。REAL、FLOAT 这类近似数值类型,直接 CAST 出来的字符串大概率是科学计数法,而且这个行为由数据库引擎底层决定,函数参数几乎无法干预。
- 别指望
ROUND(x, 2)就够——ROUND(123456789.123, 2)还是 float,CAST 后仍可能科学计数 - 真正可靠的做法是两步:先转成
DECIMAL或NUMERIC(指定精度),再 CAST 到字符串 - 如果源字段本就是
DECIMAL,那直接CAST(col AS VARCHAR(20))就行,不会触发科学计数法










