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)
我非常确定错误消息确实如此:0xa0 不是有效的 UTF-8 字符。
\n\n我的家庭服务器在 Windows XP、SP3 上运行 PostgreSQL。我可以在 psql 中做到这一点。
\n\nsandbox=# 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)\nRun Code Online (Sandbox Code Playgroud)\n\n我没有收到错误消息,但我收到了分隔符的垃圾信息。这可能是代码页问题吗?
\n\n\n\n\n作为解决方法,我在格式字符串中使用空格而不是 \n G
\n
让我们考虑一下这个问题。如果您使用空格,则在网页上该值可能会在行尾或表格单元格的边界处拆分。我认为不间断的空间可能是更好的选择。
\n\n而且,在 Unicode 中,不间断空格是 0xa0。在 Unicode 中,而不是在 UTF8 中。(也就是说,0xa0 不能是 UTF8 字符的第一个字节。请参阅UTF-8 位分布。)
\n\n另一种可能性是您的客户端期望一个字节顺序,而服务器给它一个不同的字节顺序。由于数字是单字节字符,因此字节顺序并不重要,直到它很重要。如果客户端期望一个大端字节序 MB 字符,并且它得到一个以 0xa0 开头的小端字节序 MB 字符,我希望它会因您看到的错误消息而终止。我不确定今天上班之前是否有办法对此进行测试。
\n| 归档时间: |
|
| 查看次数: |
15749 次 |
| 最近记录: |