如何将 psql 的 \timing 小数分隔符改为句点?
数据阿明
结论
\timing 显示的耗时由本地运行的 psql 客户端格式化。要让小数分隔符显示为句点,请在启动 psql 时为客户端进程设置 LC_NUMERIC:
env LC_NUMERIC=C psql -d your_database
如果环境中设置了 LC_ALL,它会覆盖 LC_NUMERIC。此时可以这样启动:
env LC_ALL=C psql -d your_database
LC_ALL=C 也会影响消息语言等其他 locale 类别。若只需调整数字格式,优先使用 LC_NUMERIC=C,并确认当前没有生效的 LC_ALL。
为什么会这样
题目中的 SET LC_MESSAGES、SET LC_MONETARY、SET LC_NUMERIC 和 SET LC_TIME 都是发给 PostgreSQL 服务器的 SQL 设置,不会更改已经运行的 psql 客户端进程的 locale。
psql 源码使用 printf 格式化计时输出,例如 Time: %.3f ms。输出中的小数分隔符由客户端进程的数字 locale 决定。psql 计时代码
操作步骤
-
退出当前
psql会话。 -
在 shell 中设置客户端环境变量,然后重新启动
psql:env LC_NUMERIC=C psql -d your_database -
在新会话中启用计时并检查输出:
\timing on SELECT 1+1;
如果输出仍显示逗号,检查当前 shell 是否设置了 LC_ALL,或运行 locale 查看 locale 环境变量。也可以设置 LC_ALL=C 后重新启动 psql,确认问题是否来自客户端环境。
注意事项
此设置作用于启动 psql 的客户端进程。在已有会话中执行 SET LC_NUMERIC 不会改变客户端的格式化 locale。不同操作系统或启动器设置环境变量的方式可能不同,关键是在启动 psql 前让正确的 locale 生效。
备注:内容仅供参考。
