我有一个使用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。
答案 0 :(得分:1)
我认为无法更改此行为。看起来Postgres假定文件名编码与server_encoding
匹配(如邮件列表here和here上的建议)。我唯一能找到的解决方法是在连接到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