排序规则术语
若要充分利用 SQL Server 2005 的语言支持,应了解本主题中所定义的术语。
术语
- 代码页
- 排序规则
- 数据类型
- 全球化
- 区域设置
- 读取顺序
- 排序次序
- Unicode
代码页
代码页是给定脚本的有序字符集,其中数值索引(即码位值)与每个字符相关联。通常将 Microsoft Windows 代码页称为“character set**”或“charset**”。代码页用于支持不同的 Windows 区域设置所使用的字符集和键盘布局。
相关主题:设置客户端代码页
返回页首
排序规则
排序规则指定表示数据集中每个字符的位模式。排序规则还决定用于数据排序和比较的规则。SQL Server 2005 支持在单个数据库中存储具有不同排序规则的对象,即 SQL Server 数据库中每列都可以有各自的排序规则。对于非 Unicode 列,排序规则设置指定数据的代码页,从而指定可以表示哪些字符。数据可以在 Unicode 列之间无缝地移动。在非 Unicode 列之间移动数据时,数据不能无缝地移动,而必须经当前代码页转换。
如果 Transact-SQL 语句运行于各自都具有不同排序规则设置的数据库的上下文中,则其运行结果可能会不同。如果可能,最佳实践应包括对组织使用标准化排序规则。如果已在组织中的所有系统上使用标准的排序规则设置,则无需在每个字符或 Unicode 表达式中显式地指定排序规则。如果必须使用具有不同排序规则和代码页设置的对象,则必须对查询进行编码以考虑排序规则优先级的规则。有关详细信息,请参阅排序规则的优先顺序 (Transact-SQL)。
排序规则的特征是区分语言、区分大小写、区分重音、区分假名以及区分全半角。
SQL Server 2005 排序规则包括下列分组:
- Windows 排序规则
Windows 排序规则根据关联的 Windows 区域设置来定义字符数据的存储规则。在 Windows 排序规则中,使用与 Unicode 数据相同的算法实现非 Unicode 数据的比较。Windows 基本排序规则指定应用字典排序时所用的字母表或语言,以及用于存储非 Unicode 字符型数据的代码页。Unicode 排序和非 Unicode 排序都与特定 Windows 版本中的字符串比较相兼容。这可以保持 SQL Server 中不同数据类型间的一致性,也使开发人员能够使用与 SQL Server 所使用的相同的规则(即通过调用 Microsoft Win32 API 的 CompareStringW 函数)在应用程序中对字符串进行排序。有关详细信息,请参阅安装程序中的排序规则设置。
二进制排序规则
二进制排序规则基于区域设置和数据类型所定义的编码值的顺序,对数据进行排序。SQL Server 中的二进制排序规则强制使用二进制排序顺序,定义了要使用的语言区域设置和 ANSI 代码页。由于二进制排序规则相对简单,因此对改进应用程序的性能非常有用。对于非 Unicode 数据类型,数据比较将基于 ANSI 代码页中定义的码位。对于 Unicode 数据类型,数据比较将基于 Unicode 码位。对于 Unicode 数据类型的二进制排序规则,数据排序将不考虑区域设置。例如,对 Unicode 数据应用 Latin_1_General_BIN 和 Japanese_BIN,会得到完全相同的排序结果。SQL Server 中早期的二进制排序规则对 Unicode 数据执行的是不完整的逐码位比较,因为 SQL Server 早期版本中的二进制排序规则将首字符作为 WCHAR 比较,然后才进行逐字节比较。出于向后兼容的原因,现有的二进制排序规则语义保持不变。
此版本的 SQL Server 中的二进制排序规则包含一组新的纯码位比较排序规则。客户可以选择迁移到新的二进制排序规则,以利用真正的码位比较,并且应该使用新的二进制排序规则来开发新的应用程序。新的 BIN2 后缀标识了实现新的码位排序规则语义的排序规则名称。另外,还为新的二进制排序规则添加了与 BIN2 对应的新比较标志。有关详细信息,请参阅使用二进制排序规则。
SQL Server 排序规则
SQL Server 排序规则提供与 SQL Server 早期版本兼容的排序顺序。SQL Server 排序规则基于由 SQL Server 为非 Unicode 数据(例如 char 和 varchar 数据类型)定义的早期 SQL Server 排序顺序。非 Unicode 数据的字典排序规则与 Windows 操作系统提供的任何排序例程都不兼容,但 Unicode 数据的排序与特定版本的 Windows 排序规则兼容。由于 SQL Server 排序规则对非 Unicode 数据和 Unicode 数据使用不同的比较规则,因此对于相同数据的比较可能看到不同的结果(取决于基本数据类型)。有关详细信息,请参阅使用 SQL 排序规则。注意: 升级 SQL Server 的实例时可以指定 SQL Server 排序规则,以便与现有 SQL Server 实例兼容。由于 SQL Server 实例的默认排序规则是在安装过程中定义的,因此在以下情况下切记要慎重指定排序规则设置: - 应用程序代码在某些方面依赖早期 SQL Server 排序规则的行为。
- 将在 SQL Server 6.5 或 SQL Server 7.0 的现有安装中使用 SQL Server 2005 复制。
- 必须存储反映多种语言的字符数据。
SQL Server 2005 支持在 SQL Server 2005 实例的下列级别设置排序规则:
服务器级排序规则
SQL Server 实例的默认排序规则在安装过程中设置。实例的默认排序规则也会成为系统数据库(master、model、tempdb、msdb 和 distribution)的默认排序规则。将排序规则指派给列或数据库以外的其他对象后,就无法再更改排序规则,除非删除并重新创建对象。可以在创建新的数据库或数据库列时指定排序规则,而不用更改 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
返回页首
数据类型
数据类型为一种定义,用于指定值的范围、可对值执行的操作以及值在计算机内存中的存储方式。对数据类型加以定义可使 SQL Server 以可预测的方式对数据进行操作。非 Unicode 字符数据类型为 char、varchar 和 text。Unicode 数据类型使用 Unicode 字符表示形式;这些数据类型为 nchar、nvarchar 和 ntext。建议在应用程序中使用 Unicode 数据类型,尤其是存储反映多种语言的字符数据时。
相关主题:数据类型(数据库引擎)、数据类型 (Transact-SQL) 和 Integration Services 数据类型
返回页首
全球化
全球化是指一种开发软件应用程序的过程,其特点为程序的功能和代码设计要兼顾多种语言和区域设置。全球化应用程序设计为数据输入、处理、显示和输出提供了多区域设置和支持 Unicode 的语言。
相关主题:SQL Server 的国际化注意事项
返回页首
区域设置
区域设置是一组与地点和区域性相关联的信息:语言的名称和标识符、用以书写语言的文字以及文化习俗。SQL Server 2005 支持由 Windows XP 所支持的全部 135 种区域设置。在这些区域设置中,包括五种中文区域设置(香港特别行政区、澳门特别行政区、中华人民共和国、新加坡和台湾)、十三种英语区域设置(澳大利亚、伯利兹、加拿大、加勒比、爱尔兰、牙买加、新西兰、菲律宾、南非、特立尼达、英国、美国和津巴布韦)和六种法语区域设置(比利时、加拿大、法国、卢森堡、摩纳哥和瑞士)。
下表说明 Windows 所支持的四种常用区域设置间的差异。
区域设置 | 英语(美国) | 法语(法国) | 日语 | 阿拉伯联合酋长国 |
---|---|---|---|---|
国家/地区 |
美国 |
法国 |
日本 |
阿拉伯联合酋长国 |
语言 |
英语 |
法语 |
日语 |
阿拉伯语 |
文字书写 |
拉丁文 |
拉丁文 |
假名、日本汉字 |
阿拉伯语 |
读取顺序 |
从左到右 |
从左到右 |
从左到右 |
从右到左 |
Windows 定义的代码页 |
1252 |
1252 |
932 |
1256 |
时间格式 |
1:00 pm |
13:00 |
13:00 |
1:00 p |
日历 |
公历 |
公历 |
公历(本地化) |
公历(本地化) |
默认纸张大小 |
U.S. Letter |
A4 |
A4 |
A4 |
小数分隔符 |
. |
, |
. |
, |
列表分隔符 |
, |
; |
, |
; |
千位分隔符 |
, |
空格 |
, |
, |
返回页首
读取顺序
读取顺序为有序文本序列的首尾方向,它与单词的顺序有关,而与输入字符的顺序无关。例如,使用阿拉伯语作为键盘语言意味着新字符将始终从右向左出现。而拉丁语为键盘语言时,新字符将从左向右出现。
返回页首
排序次序
排序顺序指定数据值的排序方式,它影响数据比较的结果。数据的排序通过排序规则实现,且可以使用索引对其进行优化。
相关主题:Windows 排序规则排序样式、索引
返回页首
Unicode
Unicode 使用两个而不是一个字节来表示语言的字符,这使得单个 Unicode 字符集可以表示世界上几乎所有书面语言。Unicode 由非营利性计算机行业组织 Unicode Consortium 开发,并且现在仍由该组织进行维护和升级。有关详细信息,请参阅 Unicode Consortium 网站。
如果存储的字符数据反映多种语言,则应始终使用 Unicode 数据类型(nchar、nvarchar 和 ntext),而不要使用非 Unicode 数据类型(char、varchar 和 text)。使用 Unicode 可以体验到显著的性能提升,因为所需的代码页转换较少。非 Unicode 数据类型有明显的局限性,因为非 Unicode 计算机只能使用单个代码页。若要全面评估与使用 Unicode 或非 Unicode 数据类型相关的问题,必须测试您的具体方案以确定在特定环境下的性能差异大小。至少应对站点排序规则进行标准化,并尽可能部署 Unicode 服务器和客户端。
多数情况下,SQL Server 实例将与其他服务器或客户端进行交互,并且实例可以使用多种数据访问标准。SQL Server 客户端是两种主要类型之一:
- 使用 OLE DB 和开放式数据库连接 (ODBC) 3.7 版或更高版本的 Unicode 客户端。
- 使用 DB-Library 和 ODBC 3.6 版或更低版本的非 Unicode 客户端。
下表显示以 Unicode 和非 Unicode 服务器的各种组合使用多语言数据的注意事项。
服务器 | 客户端 | 优点或局限性 |
---|---|---|
Unicode |
Unicode |
该方案是理想配置,因为 Unicode 数据将在整个系统中使用。该方案提供最佳性能,可以最大程度地防止检索数据的损坏。Microsoft ActiveX 数据对象 (ADO)、OLE DB 和 ODBC 3.7 版或更高版本都是这样的配置。 |
Unicode |
非 Unicode |
在此方案中,数据存储可能不是问题,但在向客户机移动数据时可能有限制。至少,必须使用非 Unicode 客户端上的代码页转换 Unicode 数据。 |
非 Unicode |
Unicode |
该方案对使用多语言数据不是理想配置。在此方案下不能向非 Unicode 服务器写入 Unicode 数据。向服务器发送代码页与服务器不同的数据时可能发生问题。 |
非 Unicode |
非 Unicode |
这是对多语言数据有极大局限性的方案。将只能使用单个代码页。理想配置是一台 Unicode 服务器配合多台 Unicode 客户端。 |
相关主题:Unicode 基础知识
返回页首