我正在尝试将包含泰语和英语的 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。