挪威语言环境变更
使用“挪威语 (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 命令将无法正常工作。您还可能在将来的转储或升级操作中遇到问题。