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

如何为PostgreSQL设置千位分隔符?,postgresql,formatting,locale,Postgresql,Formatting,Locale,我想用千位分隔符格式化长数字。可以使用to_char函数完成,如下所示: SELECT TO_CHAR(76543210.98, '999G999G990D00') 但是,当我的带有UTF-8编码的PostgreSQL server在波兰版本的Windows上运行时,这样的选择以以下内容结束: ERROR: invalid byte sequence for encoding "UTF8": 0xa0 HINT: This error can also happen if the byte

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

SELECT TO_CHAR(76543210.98, '999G999G990D00')
但是,当我的带有UTF-8编码的PostgreSQL server在波兰版本的Windows上运行时,这样的选择以以下内容结束:

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".
to_char
中,模式
G
描述为:组分隔符(使用区域设置)。 当服务器在具有波兰语言环境的Linux上运行时,此选择不会出错

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

ALTER SESSION SET NLS_NUMERIC_CHARACTERS=', ';

PostgreSQL可以使用这种设置吗?

我很确定错误消息是真的:0xa0不是有效的UTF-8字符

我的家庭服务器正在Windows XP SP3上运行PostgreSQL。我可以在psql中实现这一点

sandbox=# show client_encoding;
 client_encoding
-----------------
 UTF8
(1 row)


sandbox=# show lc_numeric;
  lc_numeric
---------------
 polish_poland
(1 row)


sandbox=# SELECT TO_CHAR(76543210.98, '999G999G990D00');
     to_char
-----------------
   76 543 210,98
(1 row)
我没有收到错误消息,但我收到了分隔符的垃圾。这可能是代码页问题吗

作为一种解决方法,我使用空间而不是 G格式字符串

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

在Unicode中,不间断的空格是0xa0。使用Unicode,而不是UTF8。(也就是说,0xa0不能是UTF8字符的第一个字节。请参阅。)


另一种可能是,您的客户机期望的是一个字节顺序,而服务器给它的是不同的字节顺序。因为数字是单字节字符,所以字节顺序并不重要,直到它变得重要。如果客户端需要一个大端MB字符,而它得到了一个以0xa0开头的小端MB字符,我希望它会随着您看到的错误消息而消失。我不确定在我今天上班之前是否有办法测试这一点。

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

\pset numericlocale
例如:

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)

您是对的,您可能使用PostgreSQL 9.0.2对其进行了测试,我使用9.0.1对其进行了测试,结果正常,但在控制台上显示为“垃圾”。有了JDBC或ODBC客户端,它就可以在没有垃圾的情况下工作,所以我认为这是PostgreSQL中修复的错误。但问题:“我可以设置临时千分位吗?”仍然没有答案。可能不在PostgreSQL的实际版本中。@Michal Niklas:请参阅上面的编辑。我不确定它的意义。谢谢。我的客户机正常工作了一段时间(psql在控制台上显示垃圾,因为控制台使用CP852)。新版本的PostgreSQL解决了select的问题。但即使使用9.0.2,我也不知道当我要导入带点的CSV文件时如何将千位分隔符设置为点,然后当其他客户向我发送带逗号的文件时,如何将千位分隔符设置为逗号。现在我必须用Python/Perl等来转换这样的文件。使用Oracle,我可以设置一些会话变量,并对其进行数据库转换。如果您可以在桌面上运行PostgreSQL,您可能可以解决这个问题。您可以在postgresql.conf中更改本地化设置并重新启动服务器。首先将数据导入桌面,然后将其推送到公司的服务器上。(有人告诉我LC\U NUMERIC也给Oracle带来了很多麻烦。)要永久性地执行此操作,请将
\pset numericlocale
放在
~/.psqlrc
中。要关闭它,请使用:
\pset numericlocale off