导入时的postgresql和排序规则问题

postgresql and collation problem when importing

我似乎无法将在 Linux 系统上创建的数据库导入我的 OSX。 一些 table 定义似乎需要特定的排序规则类型,我终究无法弄清楚哪里出了问题。

当我进行导入时,我遇到了一堆错误,但是第一个相关的然后导致其他错误的似乎是这个:

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 table,我明白了:

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 版本。

转储可能是在具有不同 C 库版本的系统上生成的。

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

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

那么您的转储应该可以正常导入。