sql server的format函数能直接格式化为千分位货币但性能差、依赖.net;mysql的format只加千分位不加符号;postgresql需用to_char()配合l/g/d模板;跨库兼容应手动拼接+round+convert。

SQL Server 的 FORMAT 函数能直接格式化为千分位货币,但性能差、依赖 .NET
SQL Server 2012+ 支持 FORMAT,写起来最直观:
SELECT FORMAT(1234567.89, 'C', 'zh-CN') -- ¥1,234,567.89但要注意:
FORMAT 底层调用 .NET 的字符串格式化,执行计划里会显示为标量函数调用,数据量大时(比如上万行)CPU 明显升高。它也不支持在计算列或索引表达式中使用。MySQL 和 PostgreSQL 没有内置 FORMAT,得用替代方案
MySQL 用 FORMAT() 函数(注意:和 SQL Server 同名但行为不同):
SELECT FORMAT(1234567.89, 2, 'zh_CN'); -- '1,234,567.89'但它只加千分位、不加货币符号,且第二个参数是小数位数,第三个参数是 locale(需系统已安装对应 locale)。PostgreSQL 则要用
to_char():SELECT to_char(1234567.89, 'L999G999G999D99'); -- ¥1,234,567.89(L=locale currency)注意
G 是千分位分隔符,D 是小数点,L 依赖 lc_monetary 设置,否则可能显示 $ 或空。跨数据库兼容写法:用字符串拼接 + CONVERT/CAST 避开 FORMAT
如果要兼容 SQL Server、MySQL、PostgreSQL,又不想依赖 locale,更稳妥的是手动拆解:
- 先转成带两位小数的字符串(避免浮点误差),例如
CONVERT(VARCHAR, ROUND(@num, 2)) - 再用
REPLACE和RIGHT/SUBSTRING分段插入逗号(适合整数部分 ≤ 9 位) - 最后拼前缀(如
'¥' + ...)
真正上线前必须验证小数精度和负数表现
很多业务场景会漏掉负数和零值:
-
FORMAT(-1234.5, 'C')在 SQL Server 中输出(¥1,234.50)(括号表示负),不是-¥1,234.50 - MySQL 的
FORMAT(0, 2)返回'0.00',但FORMAT(0.0, 2)可能返回'0.00'或'0.0'(取决于版本) - PostgreSQL 的
to_char(-1234.5, 'L999G999D99')默认输出¥-1,234.50,但若 locale 设为en_US,就变成$-1,234.50










