【问题标题】:PostgreSQL Copy To - CSV filename encodingPostgreSQL 复制到 - CSV 文件名编码
【发布时间】:2023-03-24 12:20:01
【问题描述】:

我有一个使用 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。

【问题讨论】:

  • 你用什么程序来运行copy命令?
  • 我用运行复制命令的程序更新了问题

标签: postgresql csv encoding


【解决方案1】:

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

如果您尝试在与服务器本身相同的机器上运行它,那么您可以运行psql 的客户端\copy,而不是使用服务器端COPY,这将尊重解释文件路径时的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 编码,因此您可能需要在启动 psql 之前运行 chcp 1252 来设置控制台代码页。

【讨论】:

  • 感谢您的澄清,psql \copy 返回正确的文件名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
相关资源
最近更新 更多