我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
使用适用于 Aurora PostgreSQL 的 Babelfish 处理不区分重音的排序规则
如果您正在使用拉丁语或数据库中带有重音的任何其他语言,则可能需要使用
CI_AI 归类
。
CI
代表不区分大小写,它允许您对文本进行排序和比较而不考虑大小写,对于大小写,我们还有与 C
不考虑变音符号的文本数据(包括在字母中添加的重音符号和其他字形,例如 cedilla (q)、抑扬音 (€)、变音符号 (ö)、波浪号 (n) 等。)。如果你正在使用葡萄牙语、法语、西班牙语或其他在某些字母上使用重音的语言,这可能特别有用。常见的情况是名称,在应用程序中搜索名称时,用户可能无法键入正确的名称,最终找不到所需的记录,例如 Joao 或 Joáo、Jurgen 或 Jürgen。
I
相反的
CS
(区分大小写),它在筛选 、排序和比较文本时区分大写和小写,为了强调起见,我们还有 2 种变体 AS(区分大小写),用于区分带重音和不带重音的单词,
AI
(不区分重音),允许您排序和比较
LECT* FROM fn_helpcollations ()
,以获取对象支持的归类列表。
Note: Currently, you will find 141 collations supported in Babelfish by querying
fn_helpcollations()
, but note that not all of them can be used as the default server collation (the
|
默认排序规则为
sq
l_latin1_general_cp1_ci_as。
但是,如果您的应用程序要求使用不区分重音 (
此归类表示 中的
_
as 区分重音,这意味着数据库将区分重音字符和非重音字符,例如 Jose 不等于 Jose。
AI
) 排序规则,则目前 Babelfish 不支持将不区分重音作为默认排序规则,则需要使用替代排序规则。
T-SQL 和 PostgreSQL 中使用的默认排序规则并不相同,我们在筛选或排序记录时会有不同的行为,这可能会导致语义差异。
在这篇文章中,我们将介绍如何在适用于 Aurora PostgreSQL 的 Babelfish 上使用
C I_AI
和 CS_AI
排序规则,这样你就可以继续支持拉丁语语言或任何其他带口音的语言。
先决条件和限制
要在 Babelfish 中使用 CI_AI 归类,您必须满足以下先决条件:
-
适用于 Aurora PostgreSQL 数据库集群 版本 2.1.2 (PG 14.3) 或更高版本的 Babelfish
如果您没有在低于 2.1.2 版本的 Babelfish 上明确使用 COLLATE 子句,则可能会收到一条冲突排序规则的错误消息 -
SQL 服务器管理工作室 (SSMS) - 从 SSMS 连接到你的 Babelfish 集群的权限。
CI_AI /CS_AI 归类是什么?
CI_AI
排序规则是一种既不区分大小写又不区分重音的排序规则。这意味着,如果字符串具有相同的字符,则无论大小写或重音符号如何,都将被视为相等。
CI_AS 归类
不区分大小写且区分重音。这意味着对字符串的大写和小写给予同等对待,但重音符号的处理却不一样。
例如,考虑以下两个字符串:
José
和 j
ose
。使用
CI_AS
或
CS_AS 排序规则,这两个字符串不会被视为
相等。但是,如果使用
CI_AI
排序规则,它们将被视为相等,因为排序规则会忽略大小写和重音符号,从而使两个字符串完全相同。
为什么要在 Babelfish 中使用 CI_AI 归类?
你可以考虑在你的 Babelfish 项目中使用
CI_AI
归类有以下几个原因:
-
改进了数据检索
-通过忽略大小写和重音符号,
CI_AI排 序规则可以帮助确保您的数据得到正确排序和比较,即使在排序或比较字符串的语言规则可能复杂或不一致的情况下也是如此。 -
更好地支持多语言数据检索 —
CI_AI排 序规则在处理多语言数据时特别有用,因为它们允许您对字符串进行排序和比较,无论语言之间的语言差 异中大小写或重音符号如何。 - 用户友好性 — 使用 CI_AI 归类,您可以减少需要进行的比较次数,这有助于提高应用程序的性能。
以下脚本将创建示例数据库和表,以评估在 SQL Server 上使用
CI_AI
归类的数据库的行为:
请注意,如果你在 Babelfish 上运行 C
REATE DATABASE [db-SQL-Test] COLLATE Latin1_General_CI_AI,该命令将失败,因为数据库中不支持将归类 Latin1_
General_ci_AI 作为默认排序规则。
在 SQL Server 上执行 SELECT 查询的结果如下:
请注意,即使是使用大写和非重音过滤器的查询,SQL Server 也会返回所有引用
JOS
E 的记录 ,因为我们使用的是具有归类 CI 和 AI 的数据集。
让我们在 SQL Server 上运行另一个查询:
在 SQL Server 上执行 SELECT 查询的结果如下:
请注意,该查询返回了所有记录,即使使用大写和重音过滤器,SQL Server 也会返回所有引用
José
的记录 ,因为
CI_AI
归类会忽略大小写和重音符号,从而使所有字符串完全相同。
现在让我们在 Babelfish 上运行同样的进程,但整理子句除外:
以下是对 Babelfish 的查询结果:
Babelfish 只返回两行,因为 Babelfish 支持 CI 排序规则,但不支持数据库级别的 AI 排序规则。
在 Babelfish 上使用 CI_AI 排序规则获取 Aurora PostgreSQL
使用
CI_AI
归类的另一种方法是在表创建期间指示正确的排序规则。您可以使用默认排序规则创建 Babelfish 实例,但是在创建表时,您需要为文本列指定正确的排序规则:
对 Babelfish 的查询结果如下:
通过在表创建期间在文本列中指定 collate 子句,我们现在有了预期的行为:不管 “e” 是否有重音,查询都会返回所有记录。
测试联接和排序操作
让我们测试一下我们的解决方案在使用和不使用 COLLATE 子句对表进行排序和联接时的行为:
对 Babelfish 的查询结果如下:
联接只返回了两条记录,因为我们在创建
TbPric
e 时 没有
CI_AI
子句,因此联接运算符会忽略重音记录。
现在,让我们使用使用 collat e CI_AI 子句的
tbProduct2
运行联接:
注意 :如果你运行的是低于 2.1.2 (PG 14.3) 的 Babelfish 版本,你会收到与排序规则冲突有关的错误:
“could not determine which collation to use for string comparison”
以下是对 Babelfish 的查询结果:
通过使用其中一个具有
CI_AI
归类的表,我们可以查看所有记录(CI 和 AI)。如果我们尝试在 SQL Server 中模拟相同的行为,则会得到不同的结果:
在 SQL Server 上查询的结果如下所示:
Msg 468, Level 16, State 9, Line 25 Cannot resolve the collation conflict between "Latin1_General_CI_AI" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
在这种情况下,SQL Server 无法处理排序规则冲突,这将要求开发人员使用整理 子句或更改表
排序规则
以避免此问题,而 Babelfish 会考虑 CI_AI 返回记录。
现在让我们来看看 SQL Server 和 Babelfish 之间的排序操作有何不同。首先,让我们观察 SQL Server 的行为:
下表显示了 SQL Server 上的查询结果。
| Ascending order | Descending order |
|---|---|
在 SQL Server 场景中,无论使用哪种排序模式(
ASC 或
),结果都是相同的。现在让我们在 Babelfish 中运行相同的脚本:
DESC
下表显示了对 Babelfish 的查询结果。
| Ascending order | Descending order |
|---|---|
在 Babelfish 场景中,结果是不同的:
另请注意,这两个结果都与 SQL Server 的结果不同。这是因为 PostgreSQL 处理排序操作的方式。如果您在
ASC
首先 返回未加重音的记录,而 DESC 返回的是相反的 记录。
tbProduct2
上运行与考虑 collate 子句相同的查询,则得到的结果也会有所不同:
下表显示了对 Babelfish 的查询结果。
| Ascending order | Descending order |
|---|---|
在 Babelfish 场景中,当对包含整理子句的表进行查询和排序时,结果现在与 SQL Server 相同。
在 T-SQL 表达式中显式整理子句
如果您不想或无法更改表架构,则可以在查询中添加 collate 子句以使其具有相同的行为:
对 Babelfish 的查询结果如下:
你也可以使用同样的方法来联接表:
对 Babelfish 的查询结果如下:
让我们模拟排序结果的情况,在 SQL Server 上运行以下命令:
在 SQL Server 上查询的结果如下所示:
现在让我们在 Babelfish 上运行同样的命令:
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。
马塞洛·费尔南德斯
马塞洛·费尔南德斯是 亚马逊云科技 专业服务团队的高级数据库架构师,在数据库领域拥有超过 21 年的经验。在他的整个职业生涯中,Marcelo 一直致力于帮助客户应对与数据库相关的挑战,包括迁移、设计和性能优化。