挪威语言环境变更

来自 PostgreSQL Wiki
跳转到导航跳转到搜索

使用“挪威语 (Bokmål)”语言环境的 Windows 用户重要信息

9.4.1、9.3.6 和 9.2.10 次要版本包含对 Postgres 处理 Windows 上的挪威语 (Bokmål) 语言环境方式的更改。

哪些用户受此变更影响?

所有在 Windows 上已使用“挪威语 (Bokmål)”语言环境初始化或包含任何使用“挪威语 (Bokmål)”语言环境的数据库的数据库集群。

问题是什么?

在 Windows 上,“挪威语 (Bokmål)”语言环境的名称包含一个非 ASCII 字符 (å)。它是唯一名称不是纯 ASCII 的语言环境。该非 ASCII 字符会导致一些问题。

1. 在 PostgreSQL 后端进程设置任何语言环境(使用 setlocale() 系统函数)之前,不清楚应该使用什么字符编码来对非 ASCII 字符进行编码,在调用设置语言环境时。即这是一个先有鸡还是先有蛋的问题。

2. 语言环境名称存储在 pg_database 系统目录中,该目录在集群中的所有数据库之间共享。不同的数据库可以使用不同的字符编码,因此不清楚应该使用什么编码来存储 pg_database 中的值。

3. 语言环境名称存储在 postgresql.conf 配置文件中。该文件通常只包含 ASCII 字符,因此同样不清楚应该使用什么编码。当连接到使用与配置文件中使用的编码不同的编码的数据库时,语言环境相关设置在 SHOW 和 pg_settings 视图中被错误地编码,这会导致“无效字节序列”错误。

这些潜在的问题会以多种方式表现出来。

1. 在执行 CREATE DATABASE 命令时失败。

2. 使用 pg_dumpall 恢复备份时失败。

3. 使用 pg_upgrade 升级集群时失败。

变更了什么?

为了解决这些问题,决定将有问题的“挪威语 (Bokmål)_Norway”语言环境名称映射到 Windows 也识别的同一个语言环境的别名“Norwegian_Norway”。

不幸的是,即使代码已更改为使用“Norwegian_Norway”别名,旧的、有问题的名称仍然存在于旧安装中的 pg_database 系统目录中,以及 postgresql.conf 配置文件中。这些实例需要手动转换。

Postgres 9.4.0 将有问题的名称映射到“norwegian-bokmal”,但事实证明该语言环境名称只在某些版本的 Windows 上有效。因此,我们现在推荐使用“Norwegian_Norway”。虽然使用“norwegian-bokmal”的安装本身可以正常工作,但以后将数据移至其他 Windows 系统时可能会遇到问题,因此我们建议也替换该名称。

我需要做什么?

在对系统表进行任何低级更改之前,强烈建议您首先对数据库进行完整的物理备份。

更新二进制文件后,在现有数据库集群上执行以下步骤。

1. 以超级用户身份在集群的任何数据库中运行以下两个命令。

 UPDATE pg_database SET
   datcollate = 'Norwegian_Norway' || substr(datcollate, position('.' in datcollate))
 WHERE datcollate LIKE 'Norwegian (Bokm%' OR datcollate LIKE 'norwegian-bokmal%';
 
 UPDATE pg_database SET
   datctype = 'Norwegian_Norway' || substr(datctype, position('.' in datctype))
 WHERE datctype LIKE 'Norwegian (Bokm%' OR datctype LIKE 'norwegian-bokmal%';

您只需执行一次,即使集群包含多个数据库。

2. 在文本编辑器中打开 postgresql.conf,找到设置 lc_messages、lc_monetary、lc_numeric 和 lc_time。将字符串“Norwegian (Bokmål)_Norway”替换为“Norwegian_Norway”。如果看到“norwegian-bokmal”,则将其替换为“Norwegian_Norway”。

例如,如果您的 postgresql.conf 如下所示:

 ...
 # These settings are initialized by initdb, but they can be changed.
 lc_messages = 'Norwegian (Bokmål)_Norway.1252'			# locale for system error message
 					# strings
 lc_monetary = 'Norwegian (Bokmål)_Norway.1252'			# locale for monetary formatting
 lc_numeric = 'Norwegian (Bokmål)_Norway.1252'			# locale for number formatting
 lc_time = 'Norwegian (Bokmål)_Norway.1252'				# locale for time formatting

将设置更改为:

 ...
 lc_messages = 'Norwegian_Norway.1252'			# locale for system error message
 					# strings
 lc_monetary = 'Norwegian_Norway.1252'			# locale for monetary formatting
 lc_numeric = 'Norwegian_Norway.1252'			# locale for number formatting
 lc_time = 'Norwegian_Norway.1252'				# locale for time formatting

您可能会看到一个与语言环境名称后缀不同的数字;请勿更改该数字。

3. 停止并重新启动服务器,或使用“pg_ctl reload”,以确保新的 postgresql.conf 设置生效。

4. 或者,可以使用 pg_dump/restore 或 pg_upgrade 从头开始重新创建集群,使用正确的语言环境名称。但是,不正确的名称可能会导致 pg_restore 或 pg_upgrade 失败,在这种情况下必须使用上述方法。

如果我不进行手动更改会发生什么?

除非使用“TEMPLATE=template0”选项,否则 CREATE DATABASE 命令将无法正常工作。您还可能在将来的转储或升级操作中遇到问题。