Microsoft SQL Server 2000 的国际化功效(2)[MSSQL防范]
本文“Microsoft SQL Server 2000 的国际化功效(2)[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
排序法则
每个人都把排序的数据当作理所当然的东西;毕竟,有什么比字母表更基本呢? 我们当中的一些人大概会想到利用差别字母集的语言,如希腊语、俄语、泰语或日语.但至少在美国,每个人仿佛都认为他们唯一需求考虑的就是字母表.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
问题是他们都错了! 无论您能否想理解懂西班牙语的用户为什么但愿将字母组合“ch”放在字母“h”之后作为单个字符举行排序,您都必须知道非英语语言具有差别的排序法则.普通,最有效的疏远利用程序终究用户的办法之一就是把基本排序这样的任务弄错.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
要办理问题,可以操纵排序法则(或排序次序)和称作字符串尺度化的技术.这里的“尺度化”差别于数据库开辟人员过去所习惯的尺度化概念,因为它不是一个计划问题;当您提到字符串尺度化时,实际是在考虑若何对比两个字符串使它们可以排序.这可以通过成立索引来举行优化.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
关于非 Unicode 列,排序法则具有另一种非常重要的含义:排序法则指定了数据的代码页,因而指定了可以显示哪些字符.数据可以在各 Unicode 列间毫无阻碍地移动,但数据却无法在非 Unicode 列中举行移动.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
sql server 6.5 和早期版本中的排序法则
在 SQL Server 6.5 和早期版本中,普通还依靠排序法则来指定用于语言的代码页.这些版本中存在与差别排序次序(比方在各种拉丁语中)相关的限制.别的,假如您利用的是 Latin-1,则只能支持西欧语言.因此,在 SQL Server 单个例程上的信息中可显示的差别区域设置数(即特定区域中利用的差别语言的数目)遭到了限制.这种基本问题一样实用于 SQL Server 后期版本中非 Unicode 字段的排序法则.此外,具有“最合适的”代码页的语言(比方前面在非 Unicode 文本范例:char、varchar 和 text 中说起的波斯语)方面的问题在这里也实用.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SQL Server 7.0 中的排序法则
在每台服务器上,SQL Server 7.0 都有一个 Unicode 排序法则和一个非 Unicode 排序法则.由于每个代码页可以支持多种排序,所以非 Unicode 排序法则是由代码页和排序次序 ID 两方面的抉择构成的.比方,拉丁语言普通会既答应辨别大小写的排序也答应不辨别大小写的排序,而简体中文既答应按笔画排序也答应按拼音排序.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
在 Unicode 排序法则中,可以在列中包含任何语言的任何字符,所以在这里供应了各种可用的排序法则来确保任何特定于排序法则的差别都得到精确的处理.这是办理“最合适的”代码页问题的精确办法,因为假如利用普通的 Unicode 排序法则对波斯语数据举行排序,便可认为用户供应他们所需的数据.Unicode 排序法则由一个区域设置和多个对比款式构成.区域设置普通按国家或文化区域来命名.它们按照该区域中的尺度对字符举行排序.Unicode 排序法则还为采取 Unicode 尺度的全部字符供应了一种排序次序,但指定的区域设置将具有优先权.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
下表列出了 SQL Server 7.0 中所支持的唯一 Unicode 排序法则.未列出的任何区域设置应当利用“通用 Unicode 排序法则”.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
区域设置 ID (LCID) | 阐明 |
1033 | 通用 Unicode |
33280 | 二进制次序 |
1027 | 加泰罗尼亚语 |
197636 | 中文汉语拼音字母(中国台湾区域) |
2052 | 中文标点标记 |
133124 | 中文笔画 |
1028 | 中文笔画(中国台湾区域) |
1050 | 克罗地亚语 |
1029 | 捷克语 |
1043 | 荷兰语 |
1061 | 爱沙尼亚语 |
1036 | 法语 |
66615 | 现代格鲁吉亚语 |
1031 | 德语 |
66567 | 德语电话簿 |
1038 | 匈牙利语 |
66574 | 匈牙利技术 |
1039 | 冰岛语 |
1040 | 意大利语 |
1041 | 日语 |
66577 | 日语 Unicode |
1042 | 朝鲜语 |
66578 | 朝鲜语 Unicode |
1062 | 拉脱维亚语 |
1063 | 立陶宛语 |
1071 | FYRO 马其顿语 |
1044 | 挪威语/丹麦语 |
1045 | 波兰语 |
1046 | 葡萄牙语 |
1048 | 罗马尼亚语 |
1051 | 斯络伐克语 |
1060 | 斯络文尼亚语 |
1034 | 传统西班牙语 |
3082 | 现代西班牙语 |
1053 | 瑞典语/芬兰语 |
1054 | 泰语 |
2057 | 英国英语 |
1058 | 乌克兰语 |
1066 | 越南语 |
从以上列表中您可以看到,并非全部语言都包含在内;但不要紧,因为没有必要将全部语言都包含在内.比方,通用 Unicode 排序次序不但可以精确地处理数据,还可以处理以下语言的排序:南非荷兰语、阿尔巴尼亚语、阿拉伯语、巴斯克语、白俄罗斯语、保加利亚语、英语、法罗语、波斯语、传统格鲁吉亚语、希腊语、希伯来语、印地语、印度尼西亚语、马来语、俄语、塞尔维亚语、斯瓦西里语和乌尔都语.但是,表中列出的其他语言与通用 Unicode 排序法则具有一个或多个差别之处.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
应当夸大的是,SQL Server 的开辟人员并非“政坛”人士,因而要求他们“利用另一国家/区域的排序次序”毫不是想触犯任何国家/区域.事实上,栖息在南斯拉夫塞尔维亚区域的人大概没必要为利用克罗地亚语排序次序而耽忧,因为克罗地亚语和塞尔维亚语利用的是相同的排序法则,其名称具有随便性.当与其他国家/区域的客户协同工作时,只会利用数字,因为名称实际上只是随便的阐明.最为重要的是,您可以挑选一种将使您的数据得到精确处理的排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SQL Server 7.0 中有一项很重要的更改,这就是为字符串对比供应了与操作系统无关的模子,这样从 Windows 95 到 Windows 2000 的全部操作系统间的排序法则便可以保持一致.该代码以 Windows 2000 为实现其自身字符串尺度化而利用的相同代码为底子,可以在全部计算机上封装成相同的代码.有了这一更改,SQL Server 不再依靠操作系统来实现其国际化功效 - 无论是最小的 MSDE 安装,还是最大的 SQL Server Enterprise Edition.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SQL Server 2000 的排序法则
在 SQL Server 2000 中,排序法则模子已经过更改,因为: www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
- 对两个差别排序法则的要求会招致曲解.
- 需求更机动的模子来处理可指定一个排序法则的全部新位置.
- 在 SQL Server 2000 中,排序法则还用于处理非 Unicode 列的代码页,因此会需求更多的排序法则.
SQL Server 2000 为处理 Unicode 和非 Unicode 排序而计划了一个一致的模子.该模子支持下表中所显示的语言.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SQL Server 2000 的排序法则 | ||
Albanian | Arabic | Chinese_PRC |
Chinese_PRC_Stroke | Chinese_Taiwan_Bopomofo | Chinese_Taiwan_Stroke |
Cyrillic_General | Croatian | Czech |
Danish_Norwegian | Estonian | Finnish_Swedish |
French | Georgian_Modern_sort | German_PhoneBook |
Greek | Hebrew | Hindi |
Hungarian | Hungarian_Technical | Icelandic |
Japanese | Japanese_Unicode | Korean_Wansung |
Korean_Wansung_Unicode | Latin1_General | Latvian |
Latvian | Lithuanian_Classic | FYRO Macedonian |
Modern_Spanish | Polish | Romanian |
Slovak | Slovenian | Thai |
Traditional_Spanish | Turkish | Ukrainian |
Vietnamese |
以上每一种排序法则都带有一系列后缀,以便定义能否辨别大小写、重音、宽度或化名.下表显示了大概存在的切当后缀.上表列出的 40 种语言中每一种都支持下表中的 17 种后缀,总计 680 种的 Windows 排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
排序法则的后缀 | 含义 |
_BIN | 二进制排序 |
_CI_AI | 不辨别大小写、不辨别重音、不辨别化名范例、不辨别宽度 |
_CI_AI_WS | 不辨别大小写、不辨别重音、不辨别化名范例、辨别宽度 |
_CI_AI_KS | 不辨别大小写、不辨别重音、辨别化名范例、不辨别宽度 |
_CI_AI_KS_WS | 不辨别大小写、不辨别重音、辨别化名范例、辨别宽度 |
_CI_AS | 不辨别大小写、辨别重音、不辨别化名范例、不辨别宽度 |
_CI_AS_WS | 不辨别大小写、辨别重音、 不辨别化名范例、辨别宽度 |
_CI_AS_KS | 不辨别大小写、辨别重音、辨别化名范例、不辨别宽度 |
_CI_AS_KS_WS | 不辨别大小写、辨别重音、辨别化名范例、辨别宽度 |
_CS_AI | 辨别大小写、不辨别重音、 不辨别化名范例、不辨别宽度 |
_CS_AI_WS | 辨别大小写、不辨别重音、不辨别化名范例、辨别宽度 |
_CS_AI_KS | 辨别大小写、不辨别重音、辨别化名范例、不辨别宽度 |
_CS_AI_KS_WS | 辨别大小写、不辨别重音、辨别化名范例、辨别宽度 |
_CS_AS | 辨别大小写、辨别重音、不辨别化名范例、不辨别宽度 |
_CS_AS_WS | 辨别大小写、辨别重音、不辨别化名范例、辨别宽度 |
_CS_AS_KS | 辨别大小写、辨别重音、辨别化名范例、不辨别宽度 |
_CS_AS_KS_WS | 辨别大小写、辨别重音、辨别化名范例、辨别宽度 |
这些语言的名称是随便的.挑选这些名称是为了精确地表示非 Unicode 数据的每一个唯一受支持的代码页,并表示全部数据的排序次序.在很多情形下(某种语言可以在另一代码页上完好显示,大概某种语言所需的排序次序可以被其他排序次序替换),该语言会因其可以被充分替换而从该列表中“删除”.请注意,能否辨别化名和宽度的默许设置是不辨别化名和宽度.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
为了确保 SQL Server 早期版本的代码页得到精确的支持,SQL Server 2000 中还包含了很多向下兼容并特定于 SQL 的排序次序.下面列出了这些特定于 SQL 的排序次序.很多排序次序都支持上述的部份后缀,但不支持全部后缀.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
特定于 SQL 的排序次序 | ||
SQL_1xCompat_CP850 | SQL_Estonian_CP1257 | SQL_Latin1_General_Pref_CP437 |
SQL_AltDiction_CP1253 | SQL_Hungarian_CP1250 | SQL_Latin1_General_Pref_CP850 |
SQL_AltDiction_CP850 | SQL_Icelandic_Pref_CP1 | SQL_Latvian_CP1257 |
SQL_AltDiction_Pref_CP850 | SQL_Latin1_General_CP1 | SQL_Lithuanian_CP1257 |
SQL_Croatian_CP1250 | SQL_Latin1_General_CP1250 | SQL_MixDiction_CP1253 |
SQL_Czech_CP1250 | SQL_Latin1_General_CP1251 | SQL_Polish_CP1250 |
SQL_Danish_Pref_CP1 | SQL_Latin1_General_CP1253 | SQL_Romanian_CP1250 |
SQL_EBCDIC037_CP1 | SQL_Latin1_General_CP1254 | SQL_Scandinavian_CP850 |
SQL_EBCDIC273_CP1 | SQL_Latin1_General_CP1255 | SQL_Scandinavian_Pref_CP850 |
SQL_EBCDIC277_CP1 | SQL_Latin1_General_CP1256 | SQL_Slovak_CP1250 |
SQL_EBCDIC278_CP1 | SQL_Latin1_General_CP1257 | SQL_Slovenian_CP1250 |
SQL_EBCDIC280_CP1 | SQL_Latin1_General_CP437 | SQL_SwedishPhone_Pref_CP1 |
SQL_EBCDIC284_CP1 | SQL_Latin1_General_CP850 | SQL_SwedishStd_Pref_CP1 |
SQL_EBCDIC285_CP1 | SQL_Latin1_General_Pref_CP1 | SQL_Ukrainian_CP1251 |
SQL_AltDiction_CP1253 | SQL_Hungarian_CP1250 | |
SQL_Latin1_General_Pref_CP850 |
您可以通过利用 COLLATIONPROPERTY 函数来检索有关排序法则的实际信息.除从前利用的 CodePage 值之外,您还可以传送其他信息范例,比方 LCID,它返回 Windows 区域设置 ID(关于 SQL 排序法则将返回 Null).您还可以指定 Windows ComparisonStyle (关于“二进制”和 SQL 排序法则均返回 Null).此信息可用于考证关于全部的 Windows 排序法则,Windows 2000 和 SQL Server 中的字符串尺度化能否真正等价.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
比方,通过利用 fn_helpcollations() 函数可返回全部可用的排序法则:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SELECT * FROM ::fn_helpcollations()
该查询在 SQL Server 2000 中返回了 753 行.不能增添额外的排序法则,除非要将其增添到服务包或将来的版本中.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
排序法则若何指定数据的排序
务必要扼要地阐明排序法则实际上若何处理 Unicode 数据.SQL Server 中 Unicode 列上的每种已定义排序法则都将对全部已定义的 Unicode 字符举行排序,这是无一例外的通例.由于数据排序办法存在很多差别,因此有多种差别的排序法则.现代格鲁吉亚语排序就是一个很好的示例.固然格鲁吉亚语文本的传统排序按特定的次序安排全部字符,但按照现代人的利用习惯,普通将某些很少利用的字符放在末尾.这些字符包含: www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
- HE,显示为:
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
- HEI,显示为:
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
- WE,显示为:
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
- HAR,显示为:
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
因此,可以利用两种办法对格鲁吉亚语字母表举行排序,如图 4 和图 5 所示.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
图 4:格鲁吉亚语字母表排序的传统办法www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
图 5:格鲁吉亚语字母表排序的现代办法www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
这种办法不会禁止其他任何 Unicode 数据以 Latin1_General 排序法则所供应的相同排序来举行排序.事实上,全部排序法则都按传统情势对格鲁吉亚语举行排序,只有 Georgian_Modern_Sort 排序法则属于例外.此法则一样实用于其他全部排序法则;只是差别排序法则具有差别的例外.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
在多个级别指定的排序法则
在 SQL Server 2000 中,可以在以下级别指定排序法则: www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
- 服务器级别
- 数据库级别
- 列级别
- 表达式中
在服务器级别指定的排序法则
服务器级别是排序法则普通所处的级别,它在大都情形下是唯一需求设置的排序法则.假如您没有明确设置数据库级别的排序法则,当成立该排序法则后,它将作为服务器上全部数据库中全部排序法则的默许值.因为始终要为一个数据库供应一个排序法则,所以除非是在成立数据库时,不然决不会真正考虑服务器级别的排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
您可以更改该排序法则,而无需利用“重建 Master”实用程序 (RebuildM.exe) 来重新运行 Setup.该实用程序位于 Program Files\Microsoft SQL Server\80\Tools\BINN 目录.有关具体信息,请拜见 SQL Server Books Online for SQL Server 2000 中的 "Rebuild master Utility"(重建 master 实用程序)主题.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
您还可以利用 Transact-SQL SERVERPROPERTY 函数在服务器上查询排序法则,比方:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SELECT CONVERT(char, SERVERPROPERTY('collation'))
数据库级别的排序法则
每个数据库都可以有一种唯一的排序法则,而排序次序则在数据库级别设置.下面的图解(图 6)阐明了利用 SQL Server 企业管理器来设置排序法则的办法.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
图 6:利用企业管理器设置排序法则www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
您还可以利用 Transact-SQL 来设置排序法则次序.比方,要按照捷克共和国的排序次序和辨别大小写及重音的情势成立一个新的数据库,可以利用以下语句:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
USE master
GO
CREATE DATABASE Products
ON
( NAME = products_dat,
FILENAME = 'c:\program files\microsoft sql server\mssql\data\products.mdf' )
COLLATE Czech_CS_AS
GO
风趣的是,您乃至可以利用 ALTER DATABASE 语句来更改现有数据库的排序法则(当利用 SQL Server 企业管理器时,该语句不可用).比方,以下语句将 Products 数据库的排序法则从 Czech_CS_AS 更改成 Czech_CI_AI (将辨别大小写和重音更改成不辨别大小写和重音):www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
ALTER DATABASE Products
COLLATE Czech_CI_AI
更改数据库排序法则之前的注意事项www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
要更改数据库的排序法则,必须符合以下全部条件: www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
- 不会有其他人正在利用该数据库.
- 没有依靠于数据库排序法则的架构绑定对象.符合条件的架构绑定对象包含以下任何内容:
- 用户定义的函数和用 SCHEMABINDING 成立的视图
- 已计算的列
- CHECK 约束
- 表值函数,它们利用从默许数据库排序法则担当的排序法则来返回包含字符列的表.
- 用户定义的函数和用 SCHEMABINDING 成立的视图
- 尝试更改数据库排序法则的行为不会招致任何系统名称的反复.这是很简单想象的,比方尝试将排序法则从 French_CI_AS 更改成 French_CS_AS(或将不辨别大小写更改成辨别大小写).关于 SQL Server 早期版本中的排序法则,大概有两个辨别名为 Table1 和 TABLE1 的表;但是,关于 SQL Server 2000 的排序法则,这种情形会招致反复.大概招致这种反复的对象包含:
- 对象名(如历程、表、触发器或视图).
- 构架名(如组、角色或用户).
- 标量范例名(如系统和用户定义的范例).
- 全文目录名
- 对象中的列名或参数名.
- 表中的索引名.
- 对象名(如历程、表、触发器或视图).
以上限制都具有实际的意义,它们将避免您履行会破坏数据或数据库的操作.实际上,有些人乃至认为这些法则不够严峻! 假如 text、varchar 或 char 字段中包含数据并且列上没有显式的排序法则,那么更改数据库排序法则就会改变数据编码的注释方法,从而破坏 ASCII 范围(包含在全部代码页中)外的全部字符.这样做是很危险的.相反,假如数据库包含的文本数据列不属于 Unicode 范例并且这些列没有它们自己的显式排序法则集(拜见下面的在列级别指定的排序法则),您就应当尽大概避免更改任何这些数据库的排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
此外,您也可以利用 Transact-SQL DATABASEPROPERTYEX 函数来查找数据库的排序法则,比方:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SELECT CONVERT(char, DATABASEPROPERTYEX('pubs', 'collation'))
在列级别指定的排序法则
在 SQL Server 2000 中,您可以更改特定列中文本的排序法则.这是很有效的,比方在需求对密码列强迫辨别大小写这种情形下.在其他情形下,大概会用到差别的语言列.比方,客户名大概需求以利用 Latin1_General 的 Unicode 来举行范围最广的得当排序,而产品名则大概会始终采取的是希腊语,在这种情形下,希腊语排序法则大概对比得当.以下图解(图 7)显示了在利用 SQL Server 企业管理器举行表计划的历程中的排序法则阐明.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
图 7:利用企业管理器举行表计划时的排序法则的具体阐明www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
当您单击“...”按钮时,将呈现以下图解中所示的对话框.在该对话框(图 8)中,您可以挑选一种排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
图 8:“排序法则”对话框www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
您还可以利用 Transact-SQL 设置来列级别的排序法则.在 CREATE TABLE 语句中,将 COLLATE 子句增添到列定义中便可.以下示例中的功课阐明有一个用于阿拉伯语的排序法则集(不辨别大小写、重音和化名范例).www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
CREATE TABLE jobs
(
job_id smallint
IDENTITY(1,1)
PRIMARY KEY CLUSTERED,
job_desc varchar(50)
COLLATE Arabic_CI_AI_KS
NOT NULL
DEFAULT 'New Position - title not formalized yet',
)
您可以利用 ALTER TABLE 语句来更改具有新数据范例的列级别排序法则(ntext 或 text 列除外).但是,您可以利用 SQL Server 企业管理器更改 ntext 列的排序法则.这是因为 SQL Server 企业管理器会成立一个 temp 表,将数据移动到新的 temp 表,删除旧表,利用新的排序法则成立一个新表,然后再将数据复制回新表.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
在表达式中指定的排序法则
当您需求向差别国家的用户显示数据并但愿按得当的区域设置举行排序时,大概会碰到很多情形.关于 SQL Server 2000,您可以在表达式中指定排序法则.这种强盛的新功效答应您以特定的方法举行排序,这样 ORDER BY 子句便可针关于具体的语言.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
比方,以下查询按照名和姓对 Customers 表举行排序(利用立陶宛语排序次序是排序法则差别的一个很好示例,因为字母 Y 在字母后排序的法则相当明显,很简单注意).www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SELECT
*
FROM
tblCustomers
ORDER BY
LastName COLLATE Lithuanian_AI_CI,
FirstName COLLATE Lithuanian_AI_CI
您还可以拜见 SQL Server Books Online for SQL Server 2000 中有关通例对比的示例,如:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SELECT
*
FROM
Table1
WHERE
Field1 = Field2 COLLATE Turkish_ci_ai
假定 Table1 没有显式的列级排序法则,那么这两列都将按土耳其语排序顺举行对比.要具体理解为什么会呈现这种情形,请拜见本文稍后的排序法则的优先法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
COLLATE 关键字
利用 COLLATE 关键字的语法是:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
COLLATE [<Windows_Collation_name>|<SQL_Collation_Name]
很难对排序法则的名称作出挑选.关键字可以在数据库级别、列级别或在表达式中指定.普通,只要字段不是 Unicode 范例(ntext、nvarchar 或 nchar),就会利用先前将排序法则转换为代码页的步骤.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
有两种范例的排序法则:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
Windows 排序法则www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
这些法则是由 Windows 定义的.您完好有权指定能否辨别大小写、重音、化名和宽度以及定义二进制排序.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SQL 排序法则www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
这些排序法则是由 SQL Server 为办理遗留问题而定义的.您不具有配置这些排序法则的充分权限.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
普通来说,您应当尽大概地利用 Windows 排序法则.以下图解(图 9)显示了一个排序法则大概会若何改变的简单示例.在该示例中利用的是 pubs 数据库.Y 能否呈目前 I 和 J 之间或 X 和 Z 之间,取决于能否利用立陶宛语排序法则,这无疑会影响查询中各项的排序方法.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
图 9:排序法则对排序影响的示例www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
排序法则的优先法则
在 SQL Server 2000 中,您可以在服务器、数据库和列级别以及在表达式中指定排序法则.这些排序法则是若何彼此影响的?www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
这种彼此影响需求遵守某些直接的法则,固然这些法则看起来大概有些费解,但确切是必须的.下面显示了 A 和 B 作为要对比的两个差别部份的彼此影响.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
显式 B | 隐式 B | 默许值 | 无排序法则 | |
显式 A | 运行时错误 | 显式 A | 显式 A | 显式 A |
隐式 A | 隐式 B | 无排序法则 | 隐式 A | 无排序法则 |
默许值 | 隐式 B | 隐式 B | 默许值 | 无排序法则 |
无排序法则 | 隐式 B | 无排序法则 | 无排序法则 | 无排序法则 |
下面供应了该表中各项的定义.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
显式 A/显式 Bwww.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
为给定表达式显式定义的排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
隐式 A/隐式 Bwww.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
已经在列级别定义的排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
默许值www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
正在利用的数据库级别排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
无排序法则www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
两个操作符之间存在冲突;处理表达式时无排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
正象您看到的那样,SQL Server 无法处理表达式的唯一情形包含:当您显式定义两个差别且彼此冲突的排序法则时,或当您设法对比两项却无法找到举行对比的任何共同点时.它们实际上并非限制,而是可以理解的法则.SQL Server 只需求您供应一些对比的根据.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
比方,在成立表时考虑利用下面的 Transact-SQL 语句:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
CREATE TABLE TestTab (
id int,
GreekCol nvarchar(10) COLLATE greek_ci_as,
LatinCol nvarchar(10) COLLATE latin1_general_cs_as
)
INSERT TestTab VALUES (1, N'A', N'a')
GO
该语句成立了一个包含以下两列的表:一列利用不辨别大小写和辨别重音的希腊语排序法则,而另一列利用辨别大小写和重音的通用 Latin1 排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
您可以尝试利用查询来显式对比这两列:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol
但是,该查询会返回一个错误:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
Msg 446, Level 16, State 9, Server V-MICHKA3, Line 1
无法办理等于运算的排序法则冲突.
之所以会呈现此错误,是因为服务器无法利用差别的排序法则来对比两段文本.但是,假如您利用 COLLATE 关键字显式成立一个答应这两列兼容的表达式,则查询将以以下方法履行:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
SELECT *
FROM TestTab
WHERE GreekCol = LatinCol COLLATE greek_ci_as
还需注意的是,固然 LatinCol 普通有一个辨别大小写的排序法则,但表达式不辨别大小写的排序法则会将其覆盖,从而使“A”的大写和小写被视为平等.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
COLLATE 关键字的限制
COLLATE 关键字及其相关功效是令人难以置信的.本文作者相信,在同时代的企业数据库产品中,它们也是无以伦比的.不过,它们仍存在以下列出的一些限制.请注意,这些限制都有办理办法.此处所述的限制有助于理解您可以直接履行哪些任务以及哪些任务需求一点额外的工作.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
返回不完好的排序法则列表
fn_helpcollations 函数(请拜见上文在列级别指定的排序法则中的图解)返回了完好的排序法则列表.但是,按照上文数据库级别的排序法则中所述对话框的内容,SQL Server 完好可以列出一个区域设置(如阿尔巴尼亚语),并将标志的别的部份供应为选项,以终究返回完好的字符串.假如要为该功效供应一个用户界面,则必须履行一点额外的操作.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
在列级别定义排序法则的问题
您每隔多久会碰到一个需求一种排序次序(如 Latin1_General)的数据库和一个需求另一种排序次序(如希腊语)的列?有时,这大概是一个相当关键的问题,但是在其他时刻,假如数据库中的数据未利用单一的排序法则,那么该数据便大概是需求按多种排序法则举行排序的多种语言数据.由于可以定义多种排序法则并且每种排序法则都可以编制索引,所以您可以通过指定希腊语排序法则来拜候希腊语数据,还可以使该查询成为索引搜索.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
最后一个子句“使该查询成为索引搜索”是问题的关键.在从前供应的示例中,利用查询 ORDER BY 子句中的 COLLATE 表达式便可实现这种功效;但是,这并非索引排序,因此对大型数据集而言,这种排序较慢.事实上,只有当列中没有单语言数据或数据库已撤消尺度化以便在差别列中存储差别语言时,列级排序法则才有意义.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
LCID 和排序法则
Windows 利用区域设置 ID (LCID) 来定义排序.假如您正在对后果举行格局化,那么您大概已经有了现成的 LCID(大概,您可以通过指定 1024 或利用 Microsoft Visual Basic® 格局化函数来利用默许的 LCID,以完成您的工作).事实上,假如您是在基于 Web 的 ASP 利用程序中举行这项工作,则可以利用 Microsoft Visual Basic Scripting Edition (VBScript) 中的 SetLocale 函数来更改要利用日期/时间、数字格局以及任何区域设置的钱币格局首选项.不过,排序法则和 LCID 之间无法彼此映射:由于 LCID 到排序法则是多对一的映射,您可以从一种排序法则中得到一个 LCID,但却无法从一个 LCID 中得到一种排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
这样为什么不便利呢?好吧,假想您有一个多种语言网站,来自差别国家和区域的人们都可以拜候该网站并查看产品信息.您大概已经将他们浏览器的 HTTP_ACCEPT_LANGUAGE 变量映射为 LCID,以利用 Session.LCID 属性对日期和钱币值举行格局化,并且为了便于利用,您认为利用他们的区域设置举行排序是明智的挑选.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
要构建自己的映射函数来办理这个问题,请拜见 SQL Server Books Online for SQL Server 2000 中的 "Rebuild master Utility"(Windows 排序法则指导器)主题中的转换表.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
ISO 字符串和排序法则
您可以利用以下脚本来获得 VBScript 中的 HTTP_ACCEPT_LANGUAGE 变量:www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
Dim stLang
stLang = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")
鉴于该值是很多 Web 开辟人员在处理区域设置信息所拥有的唯一值,所以 VBScript SetLocale 函数不但包含 LCID 值,并且直接承受该值.这意味着您没必要履行将该值映射为 LCID 的中间步骤.由于 SQL Server2000 无法承受象“en-us”(美国英语)这样的字符串并将其精确映射到 Latin1_General 排序法则,也无法承受象“vi”(越南语)这样的字符串并将其精确映射到越南语排序法则,因此您必须自己映射全部的字符串.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
若何定义自定义排序法则?
看过无数排序法则选项后,很多开辟人员普通会提出若何定义他们自己的排序法则这一问题.答案是他们不能定义自定义排序法则.假如排序法则不能增添到 Windows 2000 中,则一样不能增添到 SQL Server 2000 中.这是因为排序法则主要用于定义对 Unicode 尺度中每个已定义字符举行排序的办法,而并没有计划任何用户界面来让用户成立排序法则.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
注意 全部新的 SQL Server 排序法则都来自 Windows 中的信息,这就是将它们称作 Windows 排序法则的缘由.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
服务器和客户端之间的通信(代码页和排序法则问题)
在极少数的情形下,您利用 SQL Server 履行的全部操作都在服务器所在的同一台计算机上举行,并且只利用 SQL Server 工具,如 SQL 查询解析器或 SQL Server 企业管理器.但在大都情形下,服务器将与其他服务器或客户端举行交互,大概大概利用一个或多个数据拜候尺度.您大概需求知道 SQL Server 2000 是若何处理这些问题的.在此上下文中,与 SQL Server 通信的是客户端.客户端有以下两种基本范例: www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
- Unicode 客户端:OLE DB 和 ODBC 3.7 版和更高版本
- 非 Unicode 客户端:ODBC 3.7 版和早期版本以及 DB-Library
开始利用非 Unicode 数据时所面对的一个重要问题是利用 ODBC 时,数据在代码页间举行转换的方法,大概数据与 Unicode 间举行转换的方法.当 SQL_COPT_SS_TRANSLATE 属性发送给 SQLSetConnectAttr 后,它大概会有两种设置: www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
- SQL_XL_OFF
驱动程序不将客户端和服务器间交换的字符数据中的字符从一个代码页转换到另一代码页.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
- SQL_XL_ON
驱动程序将客户端和服务器间交换的字符数据中的字符从一个代码页转换到另一代码页.驱动程序会自动配置字符转换,从而肯定了安装在服务器上的代码页以及正由客户端利用的代码页.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
在默许情形下,SQL_XL_ON 是要利用的属性.您还可以利用 SQL-DMO TranslateChar 办法来设置 SQLServer 对象的 SQL_XL_ON 属性.普通情形下,无论您什么时刻处理非 Unicode 数据,该默许值城市供应所需的行为(用于启用 auto_translate).www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
客户端和服务器衔接的大概情形以及一些相关问题将在下面的主题中谈论.www.chinai tp 采吧采吧不是罪 ow er.comkJ51Khx
以上是“Microsoft SQL Server 2000 的国际化功效(2)[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:本文地址: | 与您的QQ/BBS好友分享! |