Azure PostgreSQL服务器服务排序规则创建错误

3
我正在尝试将我的现有数据库导入到运行在Azure PostgreSQL服务器上的实例中。我已经配置了我的Azure PostgreSQL服务器参数,以使用UTF8编码(我不确定它是否在没有重启的情况下应用,但即使我没有重启选项)。我正在尝试使用以下命令执行此操作:
sudo -u postgres pg_dump --encoding="UTF-8" --no-owner DBNAME | psql --host=xxx.postgres.database.azure.com --port=5432 --username=xxx@yyy --dbname=DBNAME

然而,它会出现类似以下的错误信息:
ERROR: could not create locale "en_US.utf8": No error 我深入研究了这个过程,并尝试使用UTF8(而不是UTF-8)和其他选项运行它,但每次都出现相同的错误。
我创建了一个转储文件来检查内容,生成此错误的行是:
CREATE COLLATION "en_US.utf8" (lc_collate = 'en_US.utf8', lc_ctype = 'en_US.utf8');

这是导致错误的原因。我尝试在Azure的postgre实例中手动执行它,结果也出现了同样的错误。

顺便说一下,我已经通过使用以下SQL命令从控制台创建了该DATABASE:

create database "DBNAME" with owner=xxx encoding='UTF-8' template template0;

我尝试了其他的创建和导入选项,但都无法正常工作。

有人可以帮助我吗?

3个回答

1

CREATE COLLATION 创建了一个操作系统独立的名称,可用于引用操作系统区域设置(在查询等中)。

这里的 lc_collate = 'en_US.utf8'lc_ctype = 'en_US.utf8' 是指 Linux 操作系统区域设置,在 Windows 上命名不同,Azure PostgreSQL 使用它们(在 MacOS 上也有所不同)。

在 Windows 上,这应该可以正常工作。

CREATE COLLATION "en_US.utf8" (lc_collate = 'English_United States', lc_ctype = 'English_United States');

而在 MacOS 上,

CREATE COLLATION "en_US.utf8" (lc_collate = 'en_US', lc_ctype = 'en_US');

但是大多数情况下,您不需要使用CREATE COLLATION创建自己的排序规则,而是可以直接使用PostgreSQL中预先包含的排序规则。通常使用pg_dump创建的转储文件不包括任何CREATE COLLATION语句,因为您没有自己创建任何排序规则。

除非您正在对排序规则进行特殊处理,否则可以删除这些特定于模式的排序规则,以便它们不会被包含在转储文件中。


1
我用这个命令解决了我的问题:

sudo -u postgres pg_dump -Fp —no-owner DBNAME |sed “/COLLATE/s/en_US.utf8/English_United States.1252/ig”|sed "/CREATE COLLATION/s/en_US.utf8/English_United States.1252/ig"|psql --host=aaa.postgres.database.azure.com --port=5432 --username=xxx@yyy --dbname=DBNAME

问题出在服务器操作系统的差异上。我的当前PostgreSQL服务器使用Ubuntu,但Azure PostgreSQL服务器使用的是Windows,因此排序规则名称略有不同。


1
我们之前在使用Atlassian的Confluence时遇到了同样的问题。由于排序类型不正确,应用程序无法启动。我们通过直接分配English_United States.1252来解决这个问题。
CREATE DATABASE db 
  WITH ENCODING 'UTF8' 
  LC_COLLATE    'English_United States.1252' 
  LC_CTYPE      'English_United States.1252' 
  TEMPLATE      template0 
  OWNER         conf;

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