powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как изменить кодировку открываемого файла.
9 сообщений из 9, страница 1 из 1
Как изменить кодировку открываемого файла.
    #40074952
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем.

Задача следующая. Имею *.txt файлы. Часть из них создана в Debiane как utf-8 (кодировка).
Часть из них создана в Windows в кодировке (win-1251).

Открываю как
Код: sql
1.
п_файл:=pg_read_file('/home/postgres/_analiz/_***_файл.txt') 



PostgreSQL работает из под Debian (Linux)
Файлы, которые имею кодировку UTF-8 без проблем открываются и анализируются.
А вот если попадается файл в кодировке Win-1251, то постгрес выдаёт ошибку:
Код: sql
1.
ОШИБКА:  неверная последовательность байт для кодировки "UTF8": 0xc7 0xe4



Понимаю, что как то нужно дать команду на перекодирование. В инструкциях к PostgreSQL есть
23.3. Поддержка кодировок + convert_from + convert_to

Но ничего из этого не срабатывают.
Пытался делать клиентскую кодировку внутри функции (при импорте данных из текстового файла)
Код: sql
1.
SET CLIENT_ENCODING TO 'WIN1251';


но появляется ошибка и думаю, что ошибка та же только выводится в другой кодировке
К сожалению - текст не вставляется, ниже привожу картинку.

.
Вопрос - как при открытии внешнего файла явно задать его кодировку, отличную от utf-8?
.
...
Рейтинг: 0 / 0
Как изменить кодировку открываемого файла.
    #40074954
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
файл
...
Рейтинг: 0 / 0
Как изменить кодировку открываемого файла.
    #40074955
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О
Вопрос - как при открытии внешнего файла явно задать его кодировку, отличную от utf-8?

Раз вы заранее знаете, что файл не в той кодировке, почему бы не перекодировать его перед тем, как отдавать PostgreSQL?
Код: plaintext
$ man iconv
...
Рейтинг: 0 / 0
Как изменить кодировку открываемого файла.
    #40074966
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ы2,

Спасибо, сработало.
Код: sql
1.
iconv -f WINDOWS-1251 -t UTF8 "/home/postgres/_***_файл.txt" -o /home/postgres/_***_777.txt



Но хотелось бы штатными средствами PostgreSQL.
Сейчас же придется запускать Python для запуска команды которая переведет текст из одной кодировки в другую.
.
Не совсем удобно.
.
Хочется что то от самого PostgreSQL - не поверю, чтобы такой фишки не было в PostgreSQL

.
...
Рейтинг: 0 / 0
Как изменить кодировку открываемого файла.
    #40074999
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О-О-О,

Никак...
pg_read_file не предназначен для загрузки данных и никакой конверсии кодировок не делает (и делать никогда не будет) и читает файл как есть.

Для загрузки данных существует copy from file комманда (и вот там вот конверсия кодировок работает).

В 100% случаев если некоторая функция обьявлена (как pg_read_file) superuser only - она НЕ ПРЕДНАЗНАЧЕНА для реализации любой мыслимой бизнес логики а только для АДМИНИСТРИРОВАНИЯ.

В общем не забивайте гвозди микроскопом... для этого есть молоток.

PS:
документацияNote that granting users the EXECUTE privilege on pg_read_file(), or related functions, allows them the ability to read any file on the server that the database server process can read; these functions bypass all in-database privilege checks. This means that, for example, a user with such access is able to read the contents of the pg_authid table where authentication information is stored, as well as read any table data in the database. Therefore, granting access to these functions should be carefully considered.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Как изменить кодировку открываемого файла.
    #40075007
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

Проблема в том, что текстовой файл это не записи для БД - это большой файл текстовых данных (текст) который нужно проанализировать.
.
Про COPY я знаю.
Но в *.txt файле есть перевод строк. При импортировании данных через COPY выходит сообщение - в файле есть перевод строк, замените их на '\r'. и благополучно отваливается.
То есть даже не могу загрузить для замены данных.
.
Так что вариант через COPY не годится. Жать, значит буду городить костыли.

Какая кодировка попадет - я не знаю. Там все в кучу.
.
...
Рейтинг: 0 / 0
Как изменить кодировку открываемого файла.
    #40075009
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо. Всем спасибо.
Суть задачи и проблему понял.

Буду думать, как обойти данное ограничение/особенности.
.
...
Рейтинг: 0 / 0
Как изменить кодировку открываемого файла.
    #40075031
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
select convert_from(pg_read_binary_file('/tmp/ff'), 'windows-1251');



Потому что pg_read_file возвращает тип text и на входе типа проверяется возможность существования таких символов.
...
Рейтинг: 0 / 0
Как изменить кодировку открываемого файла.
    #40075182
О-О-О
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,

Да, сработало.
Но здесь немаловажный есть нюанс.
Я почти так пробовал, но пробовал по другому:
Код: sql
1.
convert_from('text_in_win1251', 'UTF8') 


Указывал из какой кодировки в какую.
Думал, что будет сделано преобразование в формат UTF-8

и пробовал
convert('text_in_utf8', 'UTF8', 'LATIN1')
convert_to('некоторый_текст', 'UTF8')
оказалось - что нужно просто было указать не в какой формат хочу перекодировать а из какого формата нужно раскодировать!


БОЛЬШОЕ СПАСИБО Melkij.
Сработало.
Но честно говоря, не понимаю, почему для бинарных файлов этот код сработал.
В общем, еще раз спасибо.
.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как изменить кодировку открываемого файла.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]