首页/数据/SQL 速查/数字格式化:FORMAT 与 to_char
函数速查60 条

数字格式化:FORMAT 与 to_char

给数字加千分位与小数位展示:MySQL 用 FORMAT(),PostgreSQL 用 to_char();输出都是字符串,仅用于展示层。

SQL 速查数据更新于 2026-10-13

数字格式化做什么

把数值渲染成带千分位、指定小数位的展示字符串。MySQL 用 FORMAT(数值, 小数位[, 区域]),PostgreSQL 用 to_char(数值, 模板)。两者返回的都是文本,只适合展示层,不能再直接参与数值运算;跨库迁移时模板与区域参数的差异最容易被忽略。

基本信息

适用平台MySQL 与 PostgreSQL 均已支持
MySQL 语法FORMAT(x, 小数位[, 区域]):四舍五入并加千分位
PostgreSQL 语法to_char(numeric, 模板):9/0 占位,G/D 随区域,FM 去空格
返回类型字符串,不能直接参与数值运算

典型使用场景

  • 报表或前端展示千分位金额、带固定小数位的指标
  • 导出 CSV 时统一小数位,方便对账工具解析
  • 按区域展示不同分隔符(德式点号分组、逗号小数)
  • 拼接带百分号的展示文本,例如完成率
  • 生成对账或票据文本时对齐数字位数

MySQL FORMAT

MySQL FORMAT
SELECT FORMAT(1234567.891, 2);          -- '1,234,567.89' 四舍五入到两位
SELECT FORMAT(1234567.891, 0);          -- '1,234,568'
SELECT FORMAT(1234567.891, 2, 'de_DE'); -- '1.234.567,89' 德式分隔符
SELECT FORMAT(0.5, 2);                  -- '0.50' 自动补零

PostgreSQL to_char

PostgreSQL to_char
SELECT to_char(1234567.891, 'FM999,999,999.00');  -- '1,234,567.89',FM 去掉前导空格
SELECT to_char(1234567.891, 'FM999G999G999D00');  -- G=分组 D=小数点,随 lc_numeric 变化
SELECT to_char(0.4567, 'FM990.99');               -- '0.46' 四舍五入
SELECT to_char(0.4567 * 100, 'FM990.99') || '%';  -- 百分号要自己乘 100 再拼接

to_char 模板字符

符号含义
9数字位,无值时留空
0数字位,无值时补零
,固定 ASCII 千分位分隔符
.固定 ASCII 小数点
G / D随 lc_numeric 的分组符与小数点
FM去掉结果的前导与尾随空格
MI / PR负数显示为尾随减号 / 尖括号包裹
MySQL FORMAT 的区域参数依赖服务器加载的区域信息,不同容器镜像之间可能不一致,跨环境展示建议放到应用层格式化。
to_char 模板位数不足时整串会被 '#' 填满,例如两位数模板渲染三位数;按最大量级给足 9 的个数。百分号与乘 100 都要自己处理,to_char 不会自动完成。
FORMAT 与 ROUND 的分工:ROUND 返回数值、用于继续计算,FORMAT 返回带千分位的字符串、只用于展示。需要参与后续运算的列不要提前格式化,否则要再转回数值。

易错点

  • 对格式化结果按字符串排序:'1,000' 的字典序排在 '9' 前面,排序必须基于原始数值列
  • 把 FORMAT/to_char 的返回结果直接参与算术:返回的是字符串,隐式转换可能得到意外结果,计算前保留数值列
  • 用 FORMAT 的区域参数做多语言展示:结果依赖服务器区域信息,跨环境不稳定,展示层格式化更可控
  • to_char 模板位数给少了:结果整串变成 '#',表面看像丢数据,实际是模板不够宽
  • 以为 to_char 会自动加百分号:PG 既不乘 100 也不加 %,需要自己计算再拼字符串
  • 用格式化后的字符串做分页或排序键:字符串比较与数值比较不一致,分页顺序会错乱,排序键必须用原始数值

数据来源与参考

  • MySQL 8.0 Reference Manual · FORMAT
  • PostgreSQL Documentation · Data Type Formatting Functions
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌