Проблема кодирования 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 ответ

Вы пытались вручную импортировать набор данных построчно, чтобы увидеть, какие строки успешно импортированы, а какие нет? Если некоторые операции импорта выполняются успешно, а другие - нет, это может показаться проблемой целостности данных.

Если ни одна из записей не была успешно импортирована, это, очевидно, проблема кодирования.

Другие вопросы по тегам