导入时的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"
);
那么您的转储应该可以正常导入。
我似乎无法将在 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"
);
那么您的转储应该可以正常导入。