如何为PostgreSQL设置千位分隔符?

Mic*_*las 15 postgresql formatting locale

我想使用千位分隔符格式化长数字.它可以使用to_char函数完成,如:

SELECT TO_CHAR(76543210.98, '999G999G990D00')
Run Code Online (Sandbox Code Playgroud)

但是当我使用UTF-8编码的PostgreSQL服务器在波兰语版本的Windows上时,SELECT结束于:

ERROR:  invalid byte sequence for encoding "UTF8": 0xa0
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
Run Code Online (Sandbox Code Playgroud)

to_char模式G中描述为:组分隔符(使用区域设置).当服务器在具有波兰语语言环境的Linux上运行时,此SELECT可以正常运行.

作为一种解决方法,我使用空格而不是G格式字符串,但我认为应该像在Oracle中一样设置千位分隔符:

ALTER SESSION SET NLS_NUMERIC_CHARACTERS=', ';
Run Code Online (Sandbox Code Playgroud)

这样的设置是否适用于PostgreSQL?

Ali*_*bar 16

如果您使用psql,您可以执行以下操作:

\pset numericlocale
Run Code Online (Sandbox Code Playgroud)

例:

test=# create temporary table a (a numeric(20,10));
CREATE TABLE

test=# insert into a select random() * 1000000 from generate_series(1,3);
INSERT 0 3

test=# select * from a;
         a         
-------------------
 287421.6944910590
 140297.9311533270
 887215.3805568810
(3 rows)

test=# \pset numericlocale
Showing locale-adjusted numeric output.

test=# select * from a;
         a          
--------------------
 287.421,6944910590
 140.297,9311533270
 887.215,3805568810    
(3 rows)
Run Code Online (Sandbox Code Playgroud)


Mik*_*ll' 4

我非常确定错误消息确实如此:0xa0 不是有效的 UTF-8 字符。

\n\n

我的家庭服务器在 Windows XP、SP3 上运行 PostgreSQL。我可以在 psql 中做到这一点。

\n\n
sandbox=# show client_encoding;\n client_encoding\n-----------------\n UTF8\n(1 row)\n\n\nsandbox=# show lc_numeric;\n  lc_numeric\n---------------\n polish_poland\n(1 row)\n\n\nsandbox=# SELECT TO_CHAR(76543210.98, \'999G999G990D00\');\n     to_char\n-----------------\n   76\xe2\x94\xac\xc3\xa1543\xe2\x94\xac\xc3\xa1210,98\n(1 row)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我没有收到错误消息,但我收到了分隔符的垃圾信息。这可能是代码页问题吗?

\n\n
\n

作为解决方法,我在格式字符串中使用空格而不是 \n G

\n
\n\n

让我们考虑一下这个问题。如果您使用空格,则在网页上该值可能会在行尾或表格单元格的边界处拆分。我认为不间断的空间可能是更好的选择。

\n\n

而且,在 Unicode 中,不间断空格是 0xa0。在 Unicode 中,而不是在 UTF8 中。(也就是说,0xa0 不能是 UTF8 字符的第一个字节。请参阅UTF-8 位分布。)

\n\n

另一种可能性是您的客户端期望一个字节顺序,而服务器给它一个不同的字节顺序。由于数字是单字节字符,因此字节顺序并不重要,直到它很重要。如果客户端期望一个大端字节序 MB 字符,并且它得到一个以 0xa0 开头的小端字节序 MB 字符,我希望它会因您看到的错误消息而终止。我不确定今天上班之前是否有办法对此进行测试。

\n