一、排序规则简介:什么叫排序规则呢?MS是这样描述的:"在Microsoft SQL Server 中,字符串的物理存储由排序规则控制。
排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则。
"在查询分析器内执行下面语句,可以得到SQL SERVER支持的所有排序规则。
select * from ::fn_helpcollations()排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集。
如:Chinese_PRC_CS_AI_WS前半部份:指UNICODE字符集,Chinese_PRC_指针对大陆简体字UNICODE的排序规则,按拼音排序。
Chinese_PRC_Stroke 表示按汉字笔画排序;排序规则的后半部份即后缀含义:_BIN 二进制排序_CI(CS) 是否区分大小写,CI不区分,CS区分(case-insensitive/case-sensitive)_AI(AS) 是否区分重音,AI不区分,AS区分(accent-insensitive/accent-sensitive)_KI(KS) 是否区分假名类型,KI不区分,KS区分(kanatype-insensitive/kanatype-sensitive) _WI(WS) 是否区分宽度WI不区分,WS区分(width-insensitive/width-sensitive)区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。
如果选择该选项,比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项。
二、排序规则选择:如果SQL Server 实例的所有用户都使用同一种语言,则应选取支持该语言的排序规则。
例如,如果所有用户都讲法语,则选择法语排序规则。
如果您的SQL Server 实例的用户讲多种语言,则应选择能最好地满足各种语言需要的排序规则。
例如,如果用户一般都讲西欧语言,则选择Latin1_General 排序规则。
如果要支持讲多种语言的用户,则对于所有字符数据使用Unicode 数据类型nchar、nvarchar 和nvarchar(max) 是非常重要的。
Unicode 可避免非Unicode 的char、varchar 和text 数据类型带来的代码页转换难题。
因为排序规则定义用于比较操作的排序次序和Unicode 字符的排序,所以当用Unicode 数据类型实现所有列时,排序规则仍会产生不同。
即使使用Unicode 数据类型存储字符数据时,也应选择支持大多数用户的排序规则,以防使用非Unicode 数据类型实现列或变量。
SQL Server 只支持由基础操作系统支持的代码页。
在执行取决于排序规则的操作时,引用的对象所使用的SQL Server 排序规则必须使用计算机上运行的操作系统所支持的代码页。
如果指定的排序规则(或引用的对象所使用的排序规则)使用Windows 操作系统不支持的代码页,则SQL Server 将发出错误。
对此错误的响应取决于计算机上安装的Windows 操作系统的版本。
Windows 2000 及更新版本支持由SQL Server 排序规则使用的所有代码页。
因此,不会出现该错误消息。
三、排序规则的语法:Windows 排序规则名称由排序规则指示器和比较风格构成。
语法< Windows_collation_name > :: =CollationDesignator_<ComparisonStyle>< ComparisonStyle > ::=CaseSensitivity_AccentSensitivity[_KanatypeSensitive [_WidthSensitive ] ]| _BIN参数CollationDesignator指定Windows 排序规则使用的基本排序规则。
基本排序规则包括:当指定按字典排序时应用其排序规则的字母表或语言用于存储非Unicode 字符数据的代码页。
例如Latin1_General 或法文,两者都使用代码页1252,或土耳其文,它使用代码页1254。
CaseSensitivityCI 指定不区分大小写,CS 指定区分大小写。
AccentSensitivityAI 指定不区分重音,AS 指定区分重音。
KanatypeSensitiveOmitted 指定不区分大小写,KS 指定区分假名类型。
WidthSensitivityOmitted 指定不区分大小写,WS 指定区分大小写。
BIN指定使用二进制排序次序。
注释Microsoft® SQL Server™2000 Windows 排序规则的指示器为:SQL Server 2000 排序规则指示器用于非Unicode 数据的代码页支持的Windows 区域设置Albanian 1250 阿尔巴尼亚语Arabic 1256 阿拉伯语(阿尔及利亚)、阿拉伯语(巴林)、阿拉伯语(埃及)、阿拉伯语(伊朗)、阿拉伯语(约旦)、阿拉伯语(科威特)、阿拉伯语(黎巴嫩)、阿拉伯语(利比亚)、阿拉伯语(摩洛哥)、阿拉伯语(阿曼)、阿拉伯语(卡塔尔)、阿拉伯语(沙特阿拉伯)、阿拉伯语(叙利亚)、阿拉伯语(突尼斯)、阿拉伯语(阿拉伯联合酋长国)、阿拉伯语(也门)、波斯语、乌尔都语Chinese_PRC 936 中文(香港特别行政区),中文(中华人民共和国),中文(新加坡)Chinese_PRC_Stroke 936 按汉字笔画排序(中华人民共和国)Chinese_Taiwan_Bopomofo 950 按汉语拼音排序(台湾)Chinese_Taiwan_Stroke 950 繁体中文(台湾)Croatian 1250 克罗地亚语Cyrillic_General 1251 保加利亚语、白俄罗斯语、俄罗斯语、塞尔维亚语Czech 1250 捷克语Danish_Norwegian 1252 丹麦语、挪威语(Bokmål)、挪威语(Nyorsk)Estonian 1257 爱沙尼亚语Finnish_Swedish 1252 芬兰语、瑞典语French 1252 法语(比利时)、法语(加拿大)、法语(卢森堡)、法语(标准)、法语(瑞士)Georgian_Modern_Sort 1252 按现代格鲁吉亚语排序German_PhoneBook 1252 按德语电话号码簿排序Greek 1253 希腊语Hebrew 1255 希伯来语Hindi 只用于Unicode 数据类型北印度语Hungarian 1250 匈牙利语Hungarian_Technical 1250Icelandic 1252 冰岛语Japanese 932 日语Japanese_Unicode 932Korean_Wansung 949 朝鲜语Korean_Wansung_Unicode 949Latin1_General 1252 南非荷兰语、巴斯克语、加泰罗尼亚语、荷兰语(比利时)、荷兰语(标准)、英语(澳大利亚)、英语(不列颠)、英语(加拿大)、英语(加勒比)、英语(爱尔兰)、英语(牙买加)、英语(新西兰)、英语(南非)、英语(美国)、法罗语、德语(奥地利)、德语(列支敦士登)、德语(卢森堡)、德语(标准)、德语(瑞士)、印度尼西亚语、意大利语、意大利语(瑞士)、葡萄牙语(巴西)、葡萄牙语(标准)Latvian 1257 拉脱维亚语Lithuanian 1257 立陶宛语Lithuanian_Classic 1257Macedonian 1251 马其顿语Mexican_Trad_Spanish 1252 西班牙语(墨西哥)、西班牙语(传统排序)Modern_Spanish 1252 西班牙语(阿根廷)、西班牙语(玻利维亚)、西班牙语(智利)、西班牙语(哥伦比亚)、西班牙语(哥斯达黎加)、西班牙语(多米尼加共和国)、西班牙语(厄瓜多尔)、西班牙语(危地马拉)、西班牙语(现代排序)、西班牙语(巴拿马)、西班牙语(巴拉圭)、西班牙语(秘鲁)、西班牙语(乌拉圭)、西班牙语(委内瑞拉)Polish 1250 波兰语Romanian 1250 罗马尼亚语Slovak 1250 斯洛伐克语Slovenian 1250 斯洛文尼亚语Thai 874 泰国语Turkish 1254 土耳其语Ukrainian 1251 乌克兰语Vietnamese 1258 越南语示例下面是Windows 排序规则名称的一些示例:Latin1_General_CI_AS排序规则使用Latin1 General 字典排序规则,代码页为1252。
不区分大小写但区分重音。
Estonian_CS_AS排序规则使用爱沙尼亚字典排序规则,代码页为1257。
区分大小写并区分重音。
Latin1_General_BIN排序规则使用代码页1252 和二进制排序规则。
忽略Latin1 General 字典排序规则。
四、修改、查看排序规则:------修改列的排序规则ALTER TABLE tbALTER COLUMN colname nvarchar(100) COLLATE Chinese_PRC_CI_AS------修改数据库的排序规则ALTER DATABASE databaseCOLLATE Chinese_PRC_CS_AS------查看某个表的排序规则select collation from syscolumnswhere id=object_id(N'yourtablename')五、排序规则应用:SQL SERVER提供了大量的WINDOWS和SQLSERVER专用的排序规则,但它的应用往往被开发人员所忽略。
其实它在实践中大有用处。
例1:让表NAME列的内容按拼音排序:create table #t(id int,name varchar(20))insert #t select 1,'中'union all select 2,'国'union all select 3,'人'union all select 4,'阿'select * from #t order by name collate Chinese_PRC_CS_AS_KS_WSdrop table #t/*结果:id name----------- --------------------4 阿2 国3 人1 中*/例2:让表NAME列的内容按姓氏笔划排序:create table #t(id int,name varchar(20))insert #t select 1,'三'union all select 2,'乙'union all select 3,'二'union all select 4,'一'union all select 5,'十'select * from #t order by name collate Chinese_PRC_Stroke_CS_AS_KS_WSdrop table #t/*结果:id name----------- --------------------4 一2 乙3 二5 十1 三*/排序规则应用扩展:SQL SERVER汉字排序规则可以按拼音、笔划等排序,那么我们如何利用这种功能来处理汉字的一些难题呢?我现在举个例子:用排序规则的特性计算汉字笔划要计算汉字笔划,我们得先做准备工作,我们知道,WINDOWS多国汉字,UNICODE目前收录汉字共20902个。