【译】PostgreSQL locale 设置更改
以下信息侧重于使用 GNU C 库 (glibc) 的操作系统,其中包括最流行的 Linux 发行版。所有版本的 PostgreSQL 都会受到影响。其他操作系统原则上可能存在相同的问题,但我们尚未收集任何相关信息。
PostgreSQL 使用操作系统的 C 库提供的语言环境数据对文本进行排序。排序发生在各种上下文中,包括用户输出、合并连接、B 树索引和范围分区。在后两种情况下,排序后的数据被持久化到磁盘。如果 C 库中的语言环境在数据库的生命周期中发生变化,则持久化的数据可能会与预期的排序顺序不一致,从而导致错误的查询结果和其他不正确的行为。例如,如果索引未按照索引扫描所期望的方式进行排序,则查询可能无法找到实际存在的数据,并且更新可能会插入不应允许的重复数据。同样,在分区表中,查询可能会在错误的分区中查找,而更新可能会写入错误的分区。因此,对于数据库的正确操作,避免语言环境在数据库的生命周期内发生不兼容的变化是至关重要的。
操作系统供应商,尤其是 GNU C 库的作者,不时地以较小的方式更改语言环境以纠正错误或添加对更多语言的支持。虽然这在理论上违反了上述规则,但从历史上看,它影响的用户很少,也没有受到广泛关注。但是,在 2018-08-01 发布的 glibc 版本 2.28 中,包含了对语言环境数据的重大更新,这可能会影响许多用户的数据。需要注意的是,更新本身是合法的,因为它使语言环境符合当前的国际标准。但是,如果将这些更新应用于现有的 PostgreSQL 系统,则必然会出现问题。
操作系统供应商负责将 glibc 更新集成到 Linux 发行版中。我们希望长期支持 Linux 发行版的供应商不会在给定版本中对其发行版应用不兼容的语言环境更新,但这只是一种预期,因为我们无法预测或影响未来的行动。此外,PostgreSQL 目前无法检测到不兼容的 glibc 更新。因此,在规划任何更新或升级时需要一些手动操作。