当前位置:文档之家› SqlServer排序规则简介.选择.应用

SqlServer排序规则简介.选择.应用

Sql Server排序规则的简介、选择、应用一、排序规则简介:什么叫排序规则呢?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 排序规则的指示器为:示例下面是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_WS drop table #t/*结果:id name----------- --------------------4 一2 乙3 二5 十1 三*/排序规则应用扩展:SQL SERVER汉字排序规则可以按拼音、笔划等排序,那么我们如何利用这种功能来处理汉字的一些难题呢?我现在举个例子:用排序规则的特性计算汉字笔划要计算汉字笔划,我们得先做准备工作,我们知道,WINDOWS多国汉字,UNICODE目前收录汉字共20902个。

简体GBK码汉字UNICODE值从19968开始。

首先,我们先用SQLSERVER方法得到所有汉字,不用字典,我们简单利用SQL语句就可以得到:select top 20902 code=identity(int,19968,1) into #t from syscolumns a,syscolumns b再用以下语句,我们就得到所有汉字,它是按UNICODE值排序的:select code,nchar(code) as CNWord from #t然后,我们用SELECT语句,让它按笔划排序。

select code,nchar(code) as CNWordfrom #torder by nchar(code) collate Chinese_PRC_Stroke_CS_AS_KS_WS,code结果:code CNWord----------- ------19968 一20008 丨20022 丶20031 丿20032 乀20033 乁20057 乙20058 乚20059 乛20101 亅19969 丁..........从上面的结果,我们可以清楚的看到,一笔的汉字,code是从19968到20101,从小到大排,但到了二笔汉字的第一个字“丁”,CODE为19969,就不按顺序而重新开始了。

有了这结果,我们就可以轻松的用SQL语句得到每种笔划汉字归类的第一个或最后一个汉字。

下面用语句得到最后一个汉字:create table #t1(id int identity,code int,cnword nvarchar(2))insert #t1(code,cnword)select code,nchar(code) as CNWord from #torder by nchar(code) collate Chinese_PRC_Stroke_CS_AS_KS_WS,codeselect wordfrom #t1 Aleft join #t1 B on A.id=B.id-1 and A.code<B.codewhere B.code is nullorder by A.id得到36个汉字,每个汉字都是每种笔划数按Chinese_PRC_Stroke_CS_AS_KS_WS排序规则排序后的最后一个汉字:亅阝马风龙齐龟齿鸩龀龛龂龆龈龊龍龠龎龐龑龡龢龝齹龣龥齈龞麷鸞麣龖龗齾齉龘上面可以看出:“亅”是所有一笔汉字排序后的最后一个字,“阝”是所有二笔汉字排序后的最后一个字......等等。

相关主题