如何配置 Postgresql 数据库来存储任何语言字符串,同时保持排序?

问题描述 投票:0回答:1

我有一个 Postgresql 数据库,其中所有字符串字段都存储在 TEXT 列中。到目前为止,所有字符串都是英语,因此所有 BE 功能(排序、存储、查询等)都可以在英语中正确运行。

但是,我想确保任何语言的任何字符串(如果可能的话)都存储在这些相同的表中,而不对其进行修改。所有信息都将与使用这些语言的用户相关,因此我不必担心中国用户会看到任何用阿拉伯语编写的记录,因为任何其他用户都无法访问它们,但我确实关心这两个用户能够按照各自的字符集对信息进行排序(因此,阿拉伯语文本仍然在阿拉伯语语言逻辑中排序,等等)

编码设置为

UTF8
是否足以确保所有 unicode 字符都正确存储?假设任何用户只能看到相同语言的记录,这是否也可以确保任何语言的所有排序操作都是正确的?

我在 Postgresql 文档中看到,我应该了解我的

LC_TYPE
LC_COLLATE
值,以查看我的数据库支持哪些字符集。当我在 postgres 终端中执行 \l 时,我看到
encoding
设置为
UTF8
,并且
Collate
Ctype
都设置为
English_United States.1252
。是否有任何其他配置与检查相关以确保正确的排序、过滤和查询?

postgresql
1个回答
0
投票

排序是排序的问题,而不是编码的问题。 PostgreSQL 排序规则必须属于某种编码,Windows 除外。存在这种例外是因为 Windows 对 UTF-8 编码的支持有限,并且 PostgreSQL 开发人员对 Windows 在该领域的工作方式了解有限(请参阅此讨论)。

虽然编码是一个相当简单的问题(只需使用

UTF8
作为数据库编码,然后就可以存储所有字符),但编码很困难。不存在所有语言都同意的排序顺序。您必须找到一个对每个人都“足够好”的产品。

我的建议是您不要使用 C 库排序规则,而是使用 ICU 排序规则。 ICU 库提供了一种“未定义”的排序规则,它应该是一个适合每个人的中间立场。如果您使用 PostgreSQL v15 或更高版本,并且您的 PostgreSQL 是在 ICU 支持下构建的,您可以使用

创建数据库
CREATE DATABASE all_languages
   TEMPLATE template0
   ENCODING UTF8
   LOCALE_PROVIDER icu
   ICU_LOCALE und
   LOCALE "en_US";

您仍然需要指定的 C 库语言环境用于除排序规则之外的其他语言环境方面。

© www.soinside.com 2019 - 2024. All rights reserved.