0

我正在尝试将包含泰语和英语的 MySQL UTF8mb4 数据库转换为 Postgresql。在我尝试添加 tsearch 之前,这似乎进展顺利。让我概述所采取的步骤。

  • 安装这个泰语解析器https://github.com/zdk/pg-search-thai
  • 我从转储文件本地恢复生产副本到 MariaDB
  • 修复一些由于丢失而使 Postgresql 出错的枚举值。MariaDB 对他们很满意 :(
  • 将一些多边形转换为文本格式,因为 pgloader 不能优雅地处理它们。- 对新的 postgresql 数据库 testdb 运行 pgloader

    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 用于 pgloader 的 Postgresql 的正确编码是什么?
  • 除了上述方法之外,还有什么方法可以检查数据是否正确 UTF8?
  • 是泰语解析器工具的问题吗?

任何有关如何解决此问题的建议将不胜感激。

干杯,

戈登

PS 我是一位经验丰富的开发人员,但不是经验丰富的 DBA。

4

1 回答 1

0

您是否尝试过手动逐行导入数据集,查看哪些行导入成功,哪些行导入失败?如果某些导入成功但其他导入失败,则似乎是数据完整性问题。

如果没有成功导入任何记录,则显然是编码问题。

于 2017-07-11T11:17:12.670 回答