#Симптом и границы применимости
Импорт CSV в PostgreSQL падает с invalid byte sequence for encoding UTF8 или ошибкой преобразования символов. Кодировка файла, client_encoding и кодировка базы должны быть согласованы; сами байты файла менять вслепую нельзя.
#Как отличить возможные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| CSV не в UTF-8Файл создан Windows-приложением в Windows-1251 или другой кодировке. | invalid byte sequence for encoding UTF8 | Определить исходную кодировку |
| Клиент неверно декодируетФайл UTF-8, но соединение считает, что он другой кодировки. | Ошибка только в конкретном клиенте | Проверить client_encoding |
| Ошибка CSV-форматаНеверные кавычки, разделитель или переводы строк похожи на проблему кодировки. | extra data after last expected column | Сверить формат COPY |
#Пошаговая диагностика и безопасное исправление
- 1. Сохраните исходный файл без пересохраненияСкопируйте CSV в отдельный рабочий каталог, сохраните контрольную сумму и пример номера строки ошибки. Не открывайте и не сохраняйте оригинал через редактор, который молча изменяет кодировку.
- 2. Определите реальную кодировку исходного файлаНа Linux запустите file -bi и сравните с тем, в какой программе был создан экспорт. file даёт предположение; для Windows-1251 лучше дополнительно проверить кириллическую строку через пробное преобразование на копии.Linux · Терминал (Bash)КомандаТерминал Linux; чтение файла. Результат charset=... является эвристикой.
file -bi ./incoming.csv
- 3. Проверьте кодировки базы и сеансаВ psql выполните SHOW server_encoding и SHOW client_encoding. PostgreSQL обычно хранит UTF8, а импорт обязан корректно интерпретировать входные байты.SQLКомандаpsql, только чтение.
SHOW server_encoding;SHOW client_encoding;
- 4. Проверьте формат CSV на малом образцеВ тестовой копии сделайте файл из заголовка и нескольких типовых строк, затем изучите разделитель, кавычки, порядок полей и наличие заголовка. Не импортируйте полный файл повторно в рабочую таблицу: получите дубли.
- 5. Преобразуйте файл только при подтверждённой кодировкеЕсли исходный экспорт точно Windows-1251, создайте новый UTF-8 файл через iconv. Если iconv выдаёт ошибку, не используйте бездумно //IGNORE: это приведёт к потере символов.Linux · Терминал (Bash)КомандаТерминал Linux/macOS с iconv; только если кодировка подтверждена. Исходный файл остаётся неизменным.
iconv -f WINDOWS-1251 -t UTF-8 ./incoming.csv > ./incoming.utf8.csv
- 6. Импортируйте в тестовую таблицу из psqlВ psql используйте \copy в таблицу с проверенной структурой и укажите CSV HEADER. Мета-команда читает локальный файл на компьютере клиента, а серверный COPY работает с путями хоста базы.
- psql; изменяет только staging.orders на тестовой базеТекстС осторожностьюpsql; изменяет только staging.orders на тестовой базе. Названия пути и таблицы — примеры.
\copy staging.orders FROM './incoming.utf8.csv' WITH (FORMAT csv, HEADER true)Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- 7. Сверьте количество и характер данныхСравните число строк исходного файла и SELECT COUNT(*) в staging с учётом заголовка, пустых строк, кавычек и многострочных значений. Выберите несколько кириллических имен и проверьте их без искажения.
#Как проверить, что проблема устранена
Пробный импорт проходит без ошибок кодировки; контрольные строки, имена и количество записей совпадают с исходным экспортом.
#Если исправление не помогло
Если ошибка остаётся, выделите небольшой проблемный фрагмент без персональных данных и сопоставьте байты, client_encoding и формат CSV; не отключайте валидацию.