PostgreSQL Copy To - CSV кодировка имени файла - PullRequest
1 голос
/ 05 марта 2019

У меня есть настройка базы данных с кодировкой 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!

UPDATE

Я выполнил команду copy из pgAdmin, DataGrip и консоли psql.DataGrip использует JDBC и будет обрабатывать только UTF8.Все три приложения записывают имя файла csv в неправильной кодировке.Единственное отличие состоит в том, что консоль psql сообщает, что кодировка клиента - WIN1252.

1 Ответ

1 голос
/ 06 марта 2019

Я не думаю, что можно изменить это поведение.Похоже, Postgres предполагает, что кодировка имени файла соответствует server_encoding (как предлагается в списках рассылки здесь и здесь ).Единственный обходной путь, который я смог найти, - это запустить команду при подключении к WIN1252 -кодированной базе данных, что, вероятно, не очень полезно.

Если вы пытаетесь запустить это на той же машине, что и сервервместо того, чтобы использовать COPY на стороне сервера, вы можете запустить \copy на стороне клиента psql, что будет соответствовать вашему 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...