数字格式化做什么
把数值渲染成带千分位、指定小数位的展示字符串。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 返回带千分位的字符串、只用于展示。需要参与后续运算的列不要提前格式化,否则要再转回数值。