Проблема кодирования Postgresql с использованием tsearch с текстом на тайском языке после преобразования из MariaDB с использованием Pgloader
Я пытаюсь преобразовать базу данных MySQL UTF8mb4, которая содержит тайский и английский языки в Postgresql. Это, кажется, идет хорошо, пока я не пытаюсь добавить tsearch. Позвольте мне изложить шаги, предпринятые.
- Установите этот тайский парсер https://github.com/zdk/pg-search-thai
- Я восстанавливаю копию продукции локально из файла дампа в MariaDB
- Исправьте некоторые значения enum, которые приводят в порядок Postgresql из-за их отсутствия. MariaDB довольна ими:(
Конвертируйте некоторые полигоны в текстовый формат, так как pgloader не справляется с ними изящно. Запустите pgloader для новой базы данных postgresql, testdb
pgloader mysql://$MYSQL_USER:$MYSQL_PASSWORD@localhost/$MYSQL_DB postgresql://$PG_USER:$PG_PASSWORD@localhost/testdb
Это работает, сайт Laravel работает, хотя с некоторыми ошибками, которые нужно исправить из-за различий между поведением ограничений MariaDB и Postgresql. Однако когда я пытаюсь создать текстовые векторы для tsearch, я сталкиваюсь с проблемами кодирования. Это где мне нужен совет.
-- trying to create minimal case, dumping Thai names into a temporary table
CREATE EXTENSION thai_parser;
CREATE TEXT SEARCH CONFIGURATION thai_unstemmed (PARSER = thai_parser);
ALTER TEXT SEARCH CONFIGURATION thai_unstemmed ADD MAPPING FOR a WITH simple;
-- to test the parser is working, which it is
SELECT to_tsvector('thai_unstemmed', 'ข้าวเหนียวส้มตำไก่ย่าง ต้มยำกุ้ง in thailand');
-- to recreate my error I did this
CREATE TABLE vendor_names AS SELECT id,name from vendors_i18n;
ALTER TABLE vendor_names ADD COLUMN tsv_name_th tsvector;
-- this fails
UPDATE vendor_names SET tsv_name_th=to_tsvector('thai_unstemmed', coalesce(name, ''));
Я получаю ошибку ERROR: invalid byte sequence for encoding "UTF8": 0x80
Если я дам эту таблицу и восстановлю ее в новой базе данных Postgresql, я не получу ошибку кодирования.
Вопросы:
- Какую кодировку использовать для UTF8mb4 в Postgresql для pgloader?
- Есть ли какой-либо способ, кроме вышеуказанного, проверить правильность данных UTF8 или нет?
- Проблема в тайском инструменте парсера?
Любые предложения относительно того, как решить эту проблему, будут оценены.
Ура,
Гордон
PS Я опытный разработчик, но не опытный администратор баз данных.
1 ответ
Вы пытались вручную импортировать набор данных построчно, чтобы увидеть, какие строки успешно импортированы, а какие нет? Если некоторые операции импорта выполняются успешно, а другие - нет, это может показаться проблемой целостности данных.
Если ни одна из записей не была успешно импортирована, это, очевидно, проблема кодирования.