日期:2014-03-28  浏览次数:20569 次

排序规则

每个人都把排序的数据当作理所当然的东西;毕竟,有什么比字母表更基本呢? 我们当中的一些人可能会想到使用不同字母集的语言,如希腊语、俄语、泰语或日语。但至少在美国,每个人似乎都认为他们唯一需要考虑的就是字母表。

问题是他们都错了! 无论您是否想了解懂西班牙语的用户为什么希望将字母组合“ch”放在字母“h”之后作为单个字符进行排序,您都必须知道非英语语言具有不同的排序规则。通常,最有效的疏远应用程序最终用户的方法之一就是把基本排序这样的任务弄错。

要解决问题,可以利用排序规则(或排序顺序)和称作字符串标准化的技术。这里的“标准化”不同于数据库开发人员过去所习惯的标准化概念,因为它不是一个设计问题;当您提到字符串标准化时,实际是在考虑如何比较两个字符串使它们可以排序。这可以通过创建索引来进行优化。

对于非 Unicode 列,排序规则具有另一种非常重要的含义:排序规则指定了数据的代码页,因而指定了可以显示哪些字符。数据可以在各 Unicode 列间毫无阻碍地移动,但数据却无法在非 Unicode 列中进行移动。

SQL Server 6.5 和早期版本中的排序规则

在 SQL Server 6.5 和早期版本中,通常还依赖排序规则来指定用于语言的代码页。这些版本中存在与不同排序顺序(例如在各种拉丁语中)相关的限制。另外,如果您使用的是 Latin-1,则只能支持西欧语言。因此,在 SQL Server 单个例程上的信息中可显示的不同区域设置数(即特定区域中使用的不同语言的数目)受到了限制。这种基本问题同样适用于 SQL Server 后期版本中非 Unicode 字段的排序规则。此外,具有“最适合的”代码页的语言(例如前面在非 Unicode 文本类型:char、varchar 和 text 中提及的波斯语)方面的问题在这里也适用。

SQL Server 7.0 中的排序规则

在每台服务器上,SQL Server 7.0 都有一个 Unicode 排序规则和一个非 Unicode 排序规则。由于每个代码页可以支持多种排序,所以非 Unicode 排序规则是由代码页和排序顺序 ID 两方面的决策组成的。例如,拉丁语言通常会既允许区分大小写的排序也允许不区分大小写的排序,而简体中文既允许按笔画排序也允许按拼音排序。

在 Unicode 排序规则中,可以在列中包含任何语言的任何字符,所以在这里提供了各种可用的排序规则来确保任何特定于排序规则的差异都得到正确的处理。这是解决“最适合的”代码页问题的正确方法,因为如果使用一般的 Unicode 排序规则对波斯语数据进行排序,就可以为用户提供他们所需的数据。Unicode 排序规则由一个区域设置和多个比较样式组成。区域设置通常按国家或文化区域来命名。它们根据该区域中的标准对字符进行排序。Unicode 排序规则还为采用 Unicode 标准的所有字符提供了一种排序顺序,但指定的区域设置将具有优先权。

下表列出了 SQL Server 7.0 中所支持的唯一 Unicode 排序规则。未列出的任何区域设置应该使用“通用 Unicode 排序规则”。

区域设置 ID (LCID) 说明
1033 通用 Unicode
33280 二进制顺序
1027 加泰罗尼亚语
197636 中文汉语拼音字母(中国台湾地区)
2052 中文标点符号
133124 中文笔画
1028 中文笔画(中国台湾地区)
1050 克罗地亚语
1029 捷克语
1043 荷兰语
1061 爱沙尼亚语
1036 法语
66615 现代格鲁吉亚语
1031 德语
66567 德语电话簿
1038 匈牙利语
66574 匈牙利技术
1039 冰岛语
1040 意大利语
1041 日语
66577