PostgreSQL复制到-CSV文件名编码

时间:2019-03-05 10:37:10

标签: postgresql csv encoding

我有一个使用UTF-8编码的数据库设置。尝试将表复制到csv时,文件名带有特殊字符,将文件名写错到磁盘。

在Windows 10 localhost PostgreSQL安装上:

copy
  (select 'tønder')
to 'C:\temp\Sønderborg.csv' (FORMAT CSV, HEADER TRUE, DELIMITER ';', ENCODING 'UTF8');

将csv文件命名为SÃnderborg.csv,而不是Sønderborg.csv。

两者

SHOW CLIENT ENCODING;
SHOW SERVER_ENCODING;

返回UTF8

如何控制csv文件名编码? csv内部的编码可以编写Tønder!

更新

我已经从pgAdmin,DataGrip和psql控制台运行 copy 命令。 DataGrip使用JDBC,并且仅处理UTF8。这三个应用程序均以错误的编码方式写入csv文件名。唯一的区别是psql控制台说客户端编码是WIN1252。

1 个答案:

答案 0 :(得分:1)

我认为无法更改此行为。看起来Postgres假定文件名编码与server_encoding匹配(如邮件列表herehere上的建议)。我唯一能找到的解决方法是在连接到WIN1252编码的数据库时运行命令,这可能不是很有帮助。

如果您要尝试与服务器本身在同一台计算机上运行,​​那么可以使用psql的客户端{{3 }},在解释文件路径时将遵守您的client_encoding

psql -c "\copy (select 'tønder') to 'C:\temp\Sønderborg.csv' (FORMAT CSV, HEADER TRUE, DELIMITER ';', ENCODING 'UTF8')"

请注意,默认情况下,cmd.exe(甚至是powershell.exe)仍然使用旧版DOS编码,因此您可能需要运行chcp 1252来设置控制台代码页,然后再启动psql