SQL Server 排序规则

2025年3月17日 | 阅读 7 分钟

SQL Server 中的排序规则(Collation)是一套预定义的规则,用于确定数据如何存储、访问和比较。换句话说,它是一个配置设置,指示数据库引擎应如何处理字符数据。SQL Server 提供了大量的排序规则,以应对支持全球用户和应用程序所带来的语言和区域差异。本文将讨论排序规则,并通过一些示例来演示如何处理排序规则。

在哪里可以找到排序规则?

SQL 排序规则可以在服务器、数据库和列级别找到。需要注意的是,服务器、数据库和列不需要具有相同的排序规则设置。我们还可以通过更新查询来使用特定的排序规则。如果排序规则不一致,我们将认识到在整个环境中定义正确排序规则的必要性,因为存在出现意外错误的风险很高。

SQL Server 中有哪些不同类型的排序规则?

SQL Server 提供了以下系统函数来获取可用排序规则的完整列表:

以下是上述函数返回的一些排序规则名称及其描述:

SQL Server Collation

如果我们想按语言获取任何特定的排序规则,SQL Server 在 WHERE 子句中提供了 LIKE 子句来过滤名称。例如,我们正在寻找支持毛利语的排序规则。我们可以使用以下语句获取此信息:

它会返回以下排序规则名称:

SQL Server Collation

排序规则名称中有哪些不同的选项?

排序规则名称包含以下选项。这些选项在处理用于排序和搜索操作的字符数据时表现不同:

CS:区分大小写

AI:不区分重音

KS:区分假名类型

WS:区分宽度

SC:补充字符

UTF8:编码标准

假设我们在 SQL 排序规则中使用区分大小写的选项。当查询操作查找“Andrew”或“andrew”时,数据库引擎的行为将不同。如果查询找不到名为“Andrew”的姓氏的行,查询将返回空结果。这是由于排序规则的“CS-区分大小写”选项。

排序规则级别

在 SQL Server 数据库引擎的多个级别都可以指定排序规则,但默认情况下,每个级别都继承父级别的排序规则设置。以下是 SQL Server 中按降序排列的排序规则列表:

  • SQL Server 实例级别排序规则
  • 数据库级别排序规则
  • 列级别排序规则
  • 查询级别排序规则

我们来详细讨论一下。

SQL Server 实例级别排序规则

系统数据库和用户数据库的默认排序规则是 SQL Server 实例的排序规则。它在 SQL Server 启动时设置,并包含三个部分:master、tempdb 和 model。它支持除纯 Unicode 排序规则外的所有排序规则。在进行文本数据比较时,如果用户的数据库排序规则与 SQL Server 实例排序规则之一不同,那么在该数据库和 tempdb 中的表之间进行比较将导致错误。这是因为 tempdb 始终使用实例级别的默认排序规则。

如果在用户数据库中的任何 SQL 语句或函数中使用临时表,并且该临时表使用 WHERE 子句或 JOIN 条件比较基于文本的列,并且其中一个用户数据库是用与 tempdb 不同的排序规则恢复的。在这种情况下,查询将返回错误,因为表没有相同的排序规则。

我们可以使用以下查询来获取 SQL Server 实例级别的排序规则:

它显示以下输出:

SQL Server Collation

或者,我们也可以在 SQL Server Management Studio 中通过右键单击 SQL 实例,选择“属性”,然后检查“常规”选项卡来获取排序规则。此排序规则是在安装 SQL Server 时默认选择的。

SQL Server Collation

SQL Server 数据库排序规则

它继承自 SQL Server 实例的排序规则,用于数据库还原。当我们创建备份时,排序规则会复制到备份中。它是所有字符串列、临时对象、变量名和其他字符串的默认设置,因为此排序规则用于数据库中的所有元数据。如果我们未在创建数据库时指定,则使用默认服务器排序规则。

我们可以使用以下 SQL 语句来获取当前数据库的排序规则:

或者,我们也可以在 SSMS 中通过右键单击 SQL 数据库并转到“属性”来获取数据库排序规则,这将显示以下屏幕:

SQL Server Collation

我们还可以使用 CREATE DATABASE 语句来创建具有排序规则的数据库:

这里 javatpoint 是数据库名称,SQL_Latin1_General_CP1_CI_AS 是排序规则类型。如果我们想更改用户数据库的排序规则,可以使用 ALTER DATABASE 语句:

注意:除非更改服务器的排序规则,否则我们无法更改系统数据库的排序规则。此外,在数据库级别更改排序规则不会影响列或表达式级别的排序规则。

如果用户更改了数据库的默认排序规则,SQL Server 不会更改现有用户定义表的排序规则。然而,新表将以不同的数据库排序规则进行区分。但是,如果数据库包含具有不同排序规则的表,在尝试联接它们时可能会出现问题。如果我们想为现有数据库表应用新的排序规则,我们可以为表的 TEXT 列设置新的排序规则。

SQL Server 列级别排序规则

数据库指定的排序规则用作 SQL Server 用户定义列的默认排序规则。如果更改了数据库的排序规则,现有列将保留其原始排序规则,但新列将以当前的数据库排序规则生成。

我们可以使用以下语法来更改列的排序规则:

我们可以使用以下命令查找特定列的排序规则:

或者,我们也可以通过导航到表,然后是列,然后右键单击特定列以查看上下文菜单来在 SSMS 中获取列排序规则。现在,选择“属性”选项以获取排序规则类型。仅当该列的排序规则是字符数据类型时,我们才会看到排序规则详细信息。否则,它将显示一个空字段。

SQL Server Collation

SQL Server 查询级别排序规则

我们在执行语句时使用查询级别排序规则,它们会影响输出的返回方式。因此,ORDER BY 排序结果现在可以更具体。

当执行比较两个不同排序规则的列的查询时,SQL Server 不支持自动排序规则转换。我们之前也说过,排序规则遵循父级别。如果我们有多个 UNICODE 字符,我们应该使用 COLLATE 转换。我们可以使用 COLLATE 关键字,通过将排序规则名称添加到查询中来对 SQL 进行排序。COLLATE 是一个列排序规则转换关键字,用于执行排序操作。它也可以用于输入的字符字符串和列名。

我们可以使用以下语法来实现查询级别排序规则:

让我们通过示例来理解查询级别排序规则的用法。假设我们有两个具有相似排序规则的表,并且想通过 join 或子查询比较它们的列。所选表列中的数据包含小写字符串,并且表所选列存储的数据也是小写字符串。我们的要求是区分大小写地比较这两个列,但这两个列的排序规则不相同。在这种情况下,在执行查询时,查询级别排序规则允许我们覆盖数据库或列级别的排序规则。

排序规则冲突

SQL Server 支持多种排序规则。但是,它无法处理排序规则不匹配。当我们尝试比较具有不同排序规则的字段时,SQL Server 会抛出带有排序规则名称的错误。这是错误消息:

在 LIKE 操作中无法解析“Latin1_General_CI_AI”和“SQL_Latin1_General_CP1_CI_AS”之间的排序规则冲突。

如果我们想避免这些冲突,我们需要在 SQL 语句中添加一个默认排序规则设置:

此问题可能会在 SQL Server 编程时引起麻烦。如上所述,我们可以使用 COLLATE 子句和 SQL Server 列比较子句来修复此问题。首次安装 SQL Server 时,如果发现错误的排序规则选项,可能会导致 tempdb 使用问题。当 SQL Server 服务重新启动时,tempdb 会以默认的服务器级别排序规则创建。

是否可以更改系统数据库的排序规则?

无法更改系统数据库的排序规则。如果我们尝试修改系统数据库(如 master、model、msdb 或 tempdb)的排序规则,我们将收到错误消息:

这是错误消息

无法修改数据库 'master',因为它是一个系统数据库。

结论

本文将全面概述 SQL Server 中的排序规则概念。我们还了解了各种排序规则选项,如何查找任何 SQL 实例、数据库或列的排序规则详细信息,在 SQL 查询中使用排序规则选项的几个示例,如何在实例、数据库和列级别更改排序规则,如何更改系统数据库的排序规则,以及如何解决排序规则冲突。


下一个主题SQL Server 复合键