如何修改Postgres与Beekeeper Studio中money类型的全局货币符号
问题解答
结论
可以实现,但不推荐直接调整money类型的全局显示规则,更建议换用数值类型存储+自定义格式化的方案,具体实现方式如下:
方案1:修改全局lc_monetary区域参数(直接改money类型显示规则,全局生效)
PostgreSQL的money类型的货币符号、小数位格式、千位分隔符完全由lc_monetary区域配置控制,你现在看到的R$是因为当前数据库用的是巴西葡萄牙语区域(pt_BR.UTF-8)。要全局修改符号为ʛ,操作步骤如下:
- 先确认当前的区域配置:
SHOW lc_monetary;
- 如果你要对所有访问该数据库的用户生效,可以直接修改数据库级别的配置(PostgreSQL 12及以上版本支持):
ALTER DATABASE 你的实际数据库名 SET lc_monetary = '对应包含ʛ符号的locale名称';
修改完成后,所有新建立的数据库连接都会生效,已有连接需要断开重连才能看到效果。
注意:这个方案的前提是你的服务器操作系统层面存在对应包含
ʛ符号的locale配置,如果没有对应locale会报错无法生效,这种情况下建议用第二个方案。
方案2:改用numeric类型存储+自定义视图(最稳妥,完全可控)
money类型本身存在较多兼容性隐患,不同区域的客户端读写时容易出现解析错误,生产环境基本不会使用该类型。更推荐你把货币字段改成numeric类型,通过公共视图实现全局统一的格式化效果:
- 修改原表字段类型:
ALTER TABLE produto ALTER COLUMN valor_produto TYPE numeric USING valor_produto::text::numeric;
- 创建公共查询视图,所有用户访问视图即可看到统一带
ʛ符号的结果:
CREATE OR REPLACE VIEW public.produto_public AS SELECT id, codigo_produto, nome_produto, descricao_produto, estoque_produto, fabricacao_produto, 'ʛ' || to_char(valor_produto, 'FM99999999.00') AS valor_produto FROM produto;
这个方案完全不受客户端或者数据库区域配置影响,所有用户的查询结果完全一致。
内容的提问来源于stack exchange,提问作者Guilherme Gusman
相关产品推荐
相关产品推荐

