排序规则和国际术语

SQL Server 中的排序规则可为您的数据提供排序规则、区分大小写属性和区分重音属性。用于 char 和 varchar 等字符数据类型的排序规则规定可表示该数据类型的代码页和对应字符。无论是要安装新的 SQL Server 实例、还原数据库备份,还是将服务器连接到客户端数据库,了解要处理的数据的区域设置要求、排序顺序以及区分大小写和重音是很重要的。

在为您的服务器、数据库、列或表达式选择排序规则时,也在向您的数据分配某些特征,这些特征将会影响数据库中许多操作的结果。例如,使用 ORDER BY 构造查询时,结果集的排序顺序可能取决于应用于该数据库的排序规则或 COLLATE 子句中在查询的表达式级别规定的排序规则。

排序规则可以包含任何或所有以下特征:

  • 区分大小写

  • 区分重音

  • 区分假名

  • 区分全半角

为了充分利用 SQL Server 中的排序规则支持,您必须了解本主题中所定义的术语以及这些术语与您的数据的特征之间的关系。

术语

  • 排序规则

  • 区域设置

  • Unicode

  • 代码页

  • 数据类型

  • 排序顺序

排序规则

排序规则指定表示数据集中每个字符的位模式。排序规则还确定了用于数据排序和比较的规则。SQL Server 支持在单个数据库中存储具有不同排序规则的对象。对于非 Unicode 列,排序规则设置指定数据的代码页以及可以表示哪些字符。必须将在非 Unicode 列间移动的数据从源代码页转换到目标代码页。

当 Transact-SQL 语句在具有不同排序规则设置的不同数据库上下文中运行时,其运行结果可能会不同。如果可能,请为您的组织使用标准化排序规则。这样就不必显式指定每个字符或 Unicode 表达式中的排序规则。如果必须使用具有不同排序规则和代码页设置的对象,请对查询进行编码,以考虑排序规则的优先顺序规则。有关详细信息,请参阅排序规则的优先顺序 (Transact-SQL)

排序规则的特征是区分语言、区分大小写、区分重音、区分假名以及区分全半角。

SQL Server 排序规则包括下列排序规则集:

  • Windows 排序规则
    Windows 排序规则根据关联的 Windows 系统区域设置来定义字符数据的存储规则。在 Windows 排序规则中,使用与 Unicode 数据相同的算法实现非 Unicode 数据的比较。Windows 基本排序规则指定应用字典排序时所用的字母表或语言,以及用于存储非 Unicode 字符数据的代码页。Unicode 排序和非 Unicode 排序都与特定 Windows 版本中的字符串比较相兼容。这保证了 SQL Server 中所有数据类型的一致性,还使开发人员能够使用 SQL Server 所使用的相同规则对应用程序中的字符串排序。有关详细信息,请参阅安装程序中的排序规则设置

  • 二进制排序规则
    二进制排序规则基于区域设置和数据类型定义的编码值顺序来对数据进行排序。它们是区分大小写的。SQL Server 中的二进制排序规则定义了要使用的区域设置和 ANSI 代码页,并强制使用二进制排序顺序。由于它们相对简单,因此二进制排序规则有助于提高应用程序性能。对于非 Unicode 数据类型,数据比较将基于 ANSI 代码页中定义的码位。对于 Unicode 数据类型,数据比较将基于 Unicode 码位。对于 Unicode 数据类型的二进制排序规则,数据排序将不考虑区域设置。例如,对 Unicode 数据应用 Latin_1_General_BIN 和 Japanese_BIN,会得到完全相同的排序结果。

    早期版本的 SQL Server 中的二进制排序规则将第一个字符作为 WCHAR 比较,接下来进行逐字节比较。出于向后兼容的原因,现有的二进制排序规则语义保持不变。

    此版本的 SQL Server 中的二进制排序规则包含一组纯码位比较排序规则。您可以迁移到二进制排序规则,以利用真正的码位比较。您应该使用二进制排序规则来开发新的应用程序。BIN2 后缀标识了实现新的码位排序规则语义的排序规则名称。另外,新的二进制排序还有一个与 BIN2 对应的比较标志。有关详细信息,请参阅BIN 和 BIN2 排序规则的使用准则

  • SQL Server
    SQL Server 排序规则 (SQL_*) 提供与 SQL Server 早期版本兼容的排序顺序。非 Unicode 数据的字典排序规则与 Windows 操作系统提供的任何排序例程都不兼容。但是,Unicode 数据的排序与特定版本的 Windows 排序规则兼容。由于 SQL Server 排序规则对非 Unicode 数据和 Unicode 数据使用不同的比较规则,因此对于相同数据的比较将会看到不同的结果,具体取决于基本数据类型。有关详细信息,请参阅使用 SQL Server 排序规则

    注意注意

    升级 SQL Server 的英文实例时可以指定 SQL Server 排序规则 (SQL_*),以便与现有 SQL Server 实例兼容。由于 SQL Server 实例的默认排序规则是在安装过程中定义的,因此在以下情况下切记要慎重指定排序规则设置:

    • 应用程序代码依赖早期 SQL Server 排序规则的行为。

    • 将在 SQL Server 6.5 或 SQL Server 7.0 的现有安装中使用 SQL Server 复制。

    • 必须存储反映多种语言的字符数据。

支持在 SQL Server 实例的下列级别设置排序规则:

  • 服务器级排序规则
    默认排序规则是在 SQL Server 安装期间设置的,并且会成为系统数据库的默认排序规则。请注意,在 SQL Server 安装期间不能选择仅 Unicode 排序规则,因为不支持将它们用作服务器级排序规则。

    将排序规则指派给列或数据库以外的其他对象后,就无法再更改排序规则,除非删除并重新创建对象。可以在创建新的数据库或数据库列时指定排序规则,而不更改 SQL Server 实例的默认排序规则。

    若要查询 SQL Server 实例的服务器排序规则,请使用下列 Transact-SQL SERVERPROPERTY 函数:

    SELECT CONVERT (varchar, SERVERPROPERTY('collation'))
    

    若要查询服务器以找到所有可用的排序规则,请使用以下 fn_helpcollations() 内置函数:

    SELECT * from ::fn_helpcollations()
    
  • 数据库级排序规则
    创建数据库时,可以使用 CREATE DATABASE 语句的 COLLATE 子句指定默认的数据库排序规则。如果未指定排序规则,则为该数据库分配 model 数据库的默认排序规则。model 数据库的排序规则与 SQL Server 实例的默认排序规则相同。

    可使用如下的 ALTER DATABASE 语句更改用户数据库的排序规则:

    ALTER DATABASE myDB COLLATE Greek_CS_AI
    

    可以使用如下语句检索数据库的当前排序规则:

    SELECT CONVERT (varchar, DATABASEPROPERTYEX('database_name','collation'))
    
    注意注意

    更改数据库级排序规则不会影响列级排序规则或表达式级排序规则。

  • 列级排序规则
    创建表时,可以使用 CREATE TABLE 语句的 COLLATE 子句指定每个字符串列的排序规则。如果未指定排序规则,则为该列分配数据库的默认排序规则。

    可使用如下的 ALTER TABLE 语句更改列的排序规则:

    ALTER TABLE myTable ALTER COLUMN mycol NVARCHAR(10) COLLATE Greek_CS_AI
    
  • 表达式级排序规则
    表达式级排序规则在语句运行时设置,并且影响结果集的返回方式。这可以使 ORDER BY 排序结果特定于区域设置。使用如下的 COLLATE 子句可以实现表达式级排序规则:

    SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI
    

返回页首

区域设置

区域设置是一组与地点和区域性相关联的信息。它可以包括所用语言的名称和标识符、用于书写该语言的文字以及文化习俗。排序规则可以与一个或多个区域设置相关联。

返回页首

Unicode

如果存储的字符数据反映多种语言,则应始终使用 Unicode 数据类型(nchar、nvarchar 和 ntext),而不要使用非 Unicode 数据类型(char、varchar 和 text)。

非 Unicode 数据类型有明显的局限性,这是因为非 Unicode 计算机只能使用单个代码页。通过使用 Unicode 您可能会体验到性能提升,因为需要较少的代码页转换。必须在数据库级、列级或表达式级单独选择 Unicode 排序规则,因为在服务器级不支持 Unicode 排序规则。

客户端使用的代码页由操作系统的设置来确定。若要在 Windows 2000、Windows XP、Windows Server 2003 或 Windows Server 2008 操作系统上设置客户端代码页,请使用控制面板中的**“区域设置”**。

在将数据从服务器移到客户端时,服务器排序规则可能无法由旧版本的客户端驱动程序识别。在将数据从 Unicode 服务器移到非 Unicode 客户端时,可能发生这种情况。最好升级客户端操作系统,以使基础系统排序规则得以升级。如果客户端安装有数据库客户端软件,则可以考虑对数据库客户端软件应用服务更新。

还可以尝试针对服务器上的数据使用另一个排序规则。选择一个将映射到客户端上的代码页的排序规则。有关详细信息,请参阅 SQL Server 联机丛书中的“设置和更改排序规则”主题。

若要评估与使用 Unicode 或非 Unicode 数据类型相关的问题,请测试您的具体方案以确定您所在环境下的性能差异大小。最好对整个组织中的系统所使用的排序规则进行标准化,并尽可能部署 Unicode 服务器和客户端。有关 Unicode 的详细信息,请参阅 Unicode Consortium Web site(Unicode Consortium 网站)。

多数情况下,SQL Server 会与其他服务器或客户端进行交互,您的组织可能会在应用程序和服务器实例之间使用多个数据访问标准。SQL Server 客户端是两种主要类型之一:

  • 使用 OLE DB 和开放式数据库连接 (ODBC) 3.7 版或更高版本的 Unicode 客户端

  • 使用 DB-Library 和 ODBC 3.6 版或更低版本的非 Unicode 客户端

下表提供有关以 Unicode 和非 Unicode 服务器的各种组合使用多语言数据的信息。

服务器

客户端

优点或局限性

Unicode

Unicode

因为 Unicode 数据将在整个系统中使用,所以此方案可提供最佳的性能并可保护检索到的数据免受破坏。ActiveX 数据对象 (ADO)、OLE DB 和 ODBC 3.7 版或更高版本都采用这样的配置。

Unicode

非 Unicode

在这种情况下,尤其对于正在运行新操作系统的服务器与正在运行旧版本 SQL Server 或基于旧操作系统的客户端之间的连接,当您向客户端计算机移动数据时,会受到限制或出现错误。服务器上的 Unicode 数据会尝试映射到非 Unicode 客户端的对应代码页,以转换数据。

非 Unicode

Unicode

该方案对使用多语言数据不是理想配置。在此方案下不能向非 Unicode 服务器写入 Unicode 数据。在向服务器的代码页之外的服务器发送数据时,很可能会发生问题。

非 Unicode

非 Unicode

这是对多语言数据有极大局限性的方案。您只可使用一个代码页。

如果在从服务器向客户端(尤其是从 Unicode 服务器向非 Unicode 客户端)移动数据时遇到了错误或困难,旧客户端驱动程序可能无法识别您的服务器排序规则。在这种情况下,您最好升级客户端操作系统,以便更新基础系统排序规则。如果客户端安装有数据库客户端软件,则可以考虑对数据库客户端软件应用服务更新。

还可以尝试针对服务器上的数据使用另一个排序规则。选择一个将映射到客户端上的代码页的排序规则。有关更改排序规则的详细信息,请参阅 SQL Server 联机丛书中的“在 SQL Server 中设置和更改排序规则”主题。有关更改排序规则的详细信息,请参阅“SQL Server 排序规则更改最佳实践”white paper(白皮书)。有关将非 Unicode 数据类型迁移到 Unicode 数据类型的详细信息,请参阅“SQL Server 迁移至 Unicode 的最佳实践”whitepaper(白皮书)。

相关主题:Unicode 基础知识

返回页首

代码页

代码页是给定脚本的有序字符集,其中数值索引(即码位值)与每个字符相关联。Windows 代码页通常称为“字符集”或“charset”。代码页用于支持不同的 Windows 区域设置所使用的字符集和键盘布局。

所有 Windows Server 2008 Unicode 排序规则都基于 Unicode 5.0。

返回页首

数据类型

数据类型为一种定义,用于指定值的范围、可对值执行的操作以及值在内存中的存储方式。定义数据类型可使 SQL Server 以可预测的方式对数据进行操作。非 Unicode 字符数据类型为 char、varchar 和 text。Unicode 数据类型包括 nchar、nvarchar 和 ntext。建议在应用程序中使用 Unicode 数据类型,尤其是在存储反映多种语言的字符数据时。

有关将非 Unicode 数据类型迁移到 Unicode 数据类型的详细信息,请参阅“SQL Server 迁移至 Unicode 的最佳实践”whitepaper(白皮书)。

相关主题:数据类型(数据库引擎)数据类型 (Transact-SQL)Integration Services 数据类型

返回页首

排序顺序

排序顺序指定数据值的排序方式。它影响数据比较的结果。数据的排序通过使用排序规则而实现,且可使用索引对排序进行优化。

相关主题:Windows 排序规则排序样式索引

返回页首