导入时涉及PostgreSQL和排序规则问题。

3

我似乎卡在了将在Linux系统上创建的数据库导入到我的OSX上的过程中。

一些表定义似乎需要特定排序类型,但我无论如何都搞不清楚出了什么问题。

当我导入时,会出现许多错误,但第一个相关的错误似乎是这个:

pg_restore: while PROCESSING TOC:
pg_restore: from TOC entry 207; 1259 16585 TABLE drinks <<removed>>
pg_restore: error: could not execute query: ERROR:  collation "pg_catalog.ja_JP.utf8" for encoding "UTF8" does not exist
LINE 14:     "phonetic_name" character varying COLLATE "pg_catalog"."...
                                               ^
Command was: CREATE TABLE "public"."drinks" (
    <<removed>>
    "phonetic_name" character varying COLLATE "pg_catalog"."ja_JP.utf8"
);


据我了解,我需要使用 pg_catalog.ja_JP.utf8,而且在下面Laurenz Albe的回答帮助下,我成功创建了它——现在如果我查看我的 pg_collation 表,我会看到如下内容:
jlumme=# select * from pg_collation where collname like 'ja%';
  oid  |  collname   | collnamespace | collowner | collprovider | collisdeterministic | collencoding | collcollate |  collctype  | collversion
-------+-------------+---------------+-----------+--------------+---------------------+--------------+-------------+-------------+-------------
 12419 | ja_JP       |            11 |        10 | c            | t                   |            6 | ja_JP       | ja_JP       |
 12482 | ja_JP.UTF-8 |            11 |        10 | c            | t                   |            6 | ja_JP.UTF-8 | ja_JP.UTF-8 |
 12500 | ja_JP.eucJP |            11 |        10 | c            | t                   |            1 | ja_JP.eucJP | ja_JP.eucJP |
 12566 | ja_JP       |            11 |        10 | c            | t                   |            1 | ja_JP.eucJP | ja_JP.eucJP |
 13011 | ja-x-icu    |            11 |        10 | i            | t                   |           -1 | ja          | ja          | 153.14.39
 13012 | ja-JP-x-icu |            11 |        10 | i            | t                   |           -1 | ja-JP       | ja-JP       | 153.14.39
 17898 | ja_JP.utf8  |            11 |        10 | c            | t                   |            6 | ja_JP.UTF-8 | ja_JP.UTF-8 |

但是我的pg_restore仍然以相同的错误失败。

服务器上的排序设置:

<<removed>>= # select * from pg_collation where collname like 'ja%';
   collname   | collnamespace | collowner | collprovider | collencoding | collcollate  |  collctype   | collversion
--------------+---------------+-----------+--------------+--------------+--------------+--------------+-------------
 ja_JP        |            11 |        10 | c            |            1 | ja_JP        | ja_JP        |
 ja_JP.eucjp  |            11 |        10 | c            |            1 | ja_JP.eucjp  | ja_JP.eucjp  |
 ja_JP.ujis   |            11 |        10 | c            |            1 | ja_JP.ujis   | ja_JP.ujis   |
 ja_JP.utf8   |            11 |        10 | c            |            6 | ja_JP.utf8   | ja_JP.utf8   |
 japanese     |            11 |        10 | c            |            1 | japanese     | japanese     |
 japanese.euc |            11 |        10 | c            |            1 | japanese.euc | japanese.euc |
 ja_JP        |            11 |        10 | c            |            6 | ja_JP.utf8   | ja_JP.utf8   |
 ja-x-icu     |            11 |        10 | i            |           -1 | ja           | ja           | 58.0.0.50
 ja-JP-x-icu  |            11 |        10 | i            |           -1 | ja_JP        | ja_JP        | 58.0.0.50

这两台机器的语言环境不同 (locale -a):

Linux       |  OSX
ja_JP        | ja_JP.SJIS
ja_JP.eucjp  | ja_JP
ja_JP.ujis   | ja_JP.UTF-8
ja_JP.utf8   | ja_JP.eucJP
japanese     |
japanese.euc |

我使用的是postgresql 13.3版本,如果有关系的话。

1个回答

4

这个错误可能是在使用不同版本的C库的系统上生成的。

您可以像现有的那样创建缺失的排序规则:

CREATE COLLATION pg_catalog."ja_JP.utf8" (
   PROVIDER = libc,
   LC_COLLATE = "ja_JP.UTF-8",
   LC_CTYPE = "ja_JP.UTF-8"
);

那么你的转储文件应该可以成功导入。

感谢建议,Laurenz。provider 关键字似乎一直在 postgres9.6 上出现问题,所以我将我的 Mac 上的数据库升级到了 13.3 版本,然后我就能够创建排序规则了。然而,我仍然处于同样的情况,我一直收到 pg_restore: error: could not execute query: ERROR: collation "pg_catalog.ja_JP.utf8" for encoding "UTF8" does not exist 的错误信息。我已经编辑了原始问题,添加了最新的信息和格式。 - julumme
1
你需要创建数据库,连接到它并在该数据库中创建排序规则。然后将转储文件恢复到该数据库中。 - Laurenz Albe
哦,糟糕。那就是遗漏的链接。 - julumme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接