




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Sql Server排序规则的简介、选择、应用一、排序规则简介: 什么叫排序规则呢?MS是这样描述的:在 Microsoft SQL Server 中,字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则。在查询分析器内执行下面语句,可以得到SQLSERVER支持的所有排序规则。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 排序规则名称由排序规则指示器和比较风格构成。 语法 : = CollationDesignator_ := 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 区域设置Albanian1250阿尔巴尼亚语Arabic1256阿拉伯语(阿尔及利亚)、阿拉伯语(巴林)、阿拉伯语(埃及)、阿拉伯语(伊朗)、阿拉伯语(约旦)、阿拉伯语(科威特)、阿拉伯语(黎巴嫩)、阿拉伯语(利比亚)、阿拉伯语(摩洛哥)、阿拉伯语(阿曼)、阿拉伯语(卡塔尔)、阿拉伯语(沙特阿拉伯)、阿拉伯语(叙利亚)、阿拉伯语(突尼斯)、阿拉伯语(阿拉伯联合酋长国)、阿拉伯语(也门)、波斯语、乌尔都语Chinese_PRC936中文(香港特别行政区),中文(中华人民共和国),中文(新加坡)Chinese_PRC_Stroke936按汉字笔画排序(中华人民共和国)Chinese_Taiwan_Bopomofo950按汉语拼音排序(台湾)Chinese_Taiwan_Stroke950繁体中文(台湾)Croatian1250克罗地亚语Cyrillic_General1251保加利亚语、白俄罗斯语、俄罗斯语、塞尔维亚语Czech1250捷克语Danish_Norwegian1252丹麦语、挪威语 (Bokml)、挪威语(Nyorsk)Estonian1257爱沙尼亚语Finnish_Swedish1252芬兰语、瑞典语French1252法语(比利时)、法语(加拿大)、法语(卢森堡)、法语(标准)、法语(瑞士)Georgian_Modern_Sort1252按现代格鲁吉亚语排序German_PhoneBook1252按德语电话号码簿排序Greek1253希腊语Hebrew1255希伯来语Hindi只用于 Unicode 数据类型北印度语Hungarian1250匈牙利语Hungarian_Technical1250Icelandic1252冰岛语Japanese932日语Japanese_Unicode932Korean_Wansung949朝鲜语Korean_Wansung_Unicode949Latin1_General1252南非荷兰语、巴斯克语、加泰罗尼亚语、荷兰语(比利时)、荷兰语(标准)、英语(澳大利亚)、英语(不列颠)、英语(加拿大)、英语(加勒比)、英语(爱尔兰)、英语(牙买加)、英语(新西兰)、英语(南非)、英语(美国)、法罗语、德语(奥地利)、德语(列支敦士登)、德语(卢森堡)、德语(标准)、德语(瑞士)、印度尼西亚语、意大利语、意大利语(瑞士)、葡萄牙语(巴西)、葡萄牙语(标准)Latvian1257拉脱维亚语Lithuanian1257立陶宛语Lithuanian_Classic1257Macedonian1251马其顿语Mexican_Trad_Spanish1252西班牙语(墨西哥)、西班牙语(传统排序)Modern_Spanish1252西班牙语(阿根廷)、西班牙语(玻利维亚)、西班牙语(智利)、西班牙语(哥伦比亚)、西班牙语(哥斯达黎加)、西班牙语(多米尼加共和国)、西班牙语(厄瓜多尔)、西班牙语(危地马拉)、西班牙语(现代排序)、西班牙语(巴拿马)、西班牙语(巴拉圭)、西班牙语(秘鲁)、西班牙语(乌拉圭)、西班牙语(委内瑞拉)Polish1250波兰语Romanian1250罗马尼亚语Slovak1250斯洛伐克语Slovenian1250斯洛文尼亚语Thai874泰国语Turkish1254土耳其语Ukrainian1251乌克兰语Vietnamese1258越南语示例下面是 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 database COLLATE Chinese_PRC_CS_AS-查看某个表的排序规则select collation from syscolumns where id=object_id(Nyourtablename)五、排序规则应用: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_WS drop 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 CNWord from #t order 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 #t order by nchar(code) collate Chinese_PRC_Stroke_CS_AS_KS_WS,codeselect A.cnword from #t1 A left join #t1 B on A.id=B.id-1 and A.codeB.code where B.code is nullorder by A.id得到36个汉字,每个汉字都是每种笔划数按Chinese_PRC_Stroke_CS_AS_KS_WS排序规则排序后的最后一个汉字:亅阝马风龙齐龟齿鸩龀龛龂龆龈龊龍龠龎龐龑龡龢龝齹龣龥齈龞麷鸞麣龖龗齾齉龘上面可以看出:“亅”是所有一笔汉字排序后的最后一个字,“阝”是所有二笔汉字排序后的最后一个字.等等。但同时也发现,从第33个汉字“龗(33笔)”后面的笔划有些乱,不正确。但没关系,比“龗”笔划多的只有四个汉字,我们手工加上:齾35笔,齉36笔,靐39笔,龘64笔建汉字笔划表(TAB_HZBH):create table tab_hzbh(id int identity,cnword nchar(1)-先插入前33个汉字insert tab_hzbhselect top 33 A.cnword from #t1 A left join #t1 B on A.id=B.id-1 and A.code=a collate Chinese_PRC_Stroke_CS_AS_KS_WSorder by idid - 8(结果:汉字“国”笔划数为8)上面所有准备过程,只是为了写下面这个函数,这个函数撇开上面建的所有临时表和固定表,为了通用和代码转移方便,把表tab_hzbh的内容写在语句内,然后计算用户输入一串汉字的总笔划:create function fun_getbh(str nvarchar(4000)returns intasbegindeclare word nchar(1),n intset n=0while len(str)0beginset word=left(str,1)-如果非汉字,笔划当0计set n=n+(case when unicode(word) between 19968 and 19968+20901then (select top 1 id from (select 1 as id,N亅 as word union all select 2,N阝 union all select 3,N马 union all select 4,N风 union all select 5,N龙 union all select 6,N齐 union all select 7,N龟 union all select 8,N齿 union all select 9,N鸩 union all select 10,N龀 union all select 11,N龛 union all select 12,N龂 union all select 13,N龆 union all select 14,N龈 union all select 15,N龊 union all select 16,N龍 union all select 17,N龠 union all select 18,N龎 union all select 19,N龐 union all select 20,N龑 union all select 21,N龡 union all select 22,N龢 union all select 23,N龝 union all select 24,N齹 union all select 25,N龣 union all select 26,N龥 union all select 27,N齈 union all select 28,N龞 union all select 29,N麷 union all select 30,N鸞 union all select 31,N麣 union all select 32,N龖 union all select 33,N龗 union all select 35,N齾 union all select 36,N齉 union all select 39,N靐 union all select 64,N龘 ) T where word=word collate Chinese_PRC_Stroke_CS_AS_KS_WSorder by id ASC) else 0 end)set str=right(str,len(str)-1)endreturn nend-函数调用实例:select dbo.fun_getbh(中华人民共和国),dbo.fun_getbh(中華人民共和國)执行结果:笔划总数分别为39和46,简繁体都行。 当然,你也可以把上面“UNIONALL”内的汉字和笔划改存在固定表内,在汉字列建CLUSTERED INDEX,列排序规则设定为: Chinese_PRC_Stroke_CS_AS_KS_WS这样速度更快。如果你用的是BIG5码的操作系统,你得另外生成汉字,方法一样。但有一点要记住:这些汉字是通过SQL语句SELECT出来的,不是手工输入的,更不是查字典得来的,因为新华字典毕竟不同于UNICODE字符集,查字典的结果会不正确。 用排序规则的特性得到汉字拼音首字母用得到笔划总数相同的方法,我们也可以写出求汉字拼音首字母的函数。如下:create function fun_getPY(str nvarchar(4000)returns nvarchar(4000)asbegindeclare word nchar(1),PY nvarchar(4000)set PY=while len(str)0beginset word=left(str,1)-如果非汉字字符,返回原字符set PY=PY+(case when unicode(word) between 19968 and 19968+20901then (select top 1 PY from (select A as PY,N驁 as wordunion all select B,N簿union all select C,N錯union all select D,N鵽union all select E,N樲union all select F,N鰒union all select G,N腂union all select H,N夻union all select J,N攈union all select K,N穒union all select L,N鱳union all select M,N旀union all select N,N桛union all select O,N漚union all select P,N曝union all select Q,N囕union all select R,N鶸union all select S,N蜶union all select T,N籜union all select W,N鶩union all select X,N鑂union all select Y,N韻union all select Z,N咗) T where word=word collate Chinese_PRC_CS_AS_KS_WS order by PY ASC) else word end)set str=right(str,len(str)-1)endreturn PYend-函数调用实例:select dbo.fun_getPY(中华人民共和国),dbo.fun_getPY(中華人民共和國)结果都为:ZHRMGHG六、常见问题处理:1.“无法解决 equal to 操作的排序规则冲突。” 示例1:create table #t1(name varchar(20) collate Albanian_CI_AI_WS, value i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能语音财务分析工具创新创业项目商业计划书
- 智能通风算法创新创业项目商业计划书
- 农作物保险服务创新创业项目商业计划书
- 量子隧道检测装置创新创业项目商业计划书
- 智能招聘系统创新创业项目商业计划书
- 2025年线下演出市场复苏后演出市场政策环境与市场机遇研究报告
- 2025年环境影响评价公众参与机制优化与绿色产业集聚区建设研究
- 2025年无人机物流配送在物流行业物流配送服务创新中的应用报告
- 2025年沉浸式戏剧剧本创作与市场推广策略研究报告
- 2025年海上风力发电场运维信息化平台建设与运维报告
- GA/T 1237-2015人员基础信息采集设备通用技术规范
- GA 668-2006警用防暴车通用技术条件
- 一带一路战略课件
- A-level项目介绍(课堂)课件
- 《C语言程序设计》一等奖说课稿
- 飞机制造技术-知识点汇总
- 消防验收备案表
- 现场勘查学(全套课件)
- 《网络综合布线技术》教学教案
- 洗煤厂安全安全生产岗位责任制(很全)
- MaxPlax噬菌体包装试剂盒中文说明书(epicentreofillumina)
评论
0/150
提交评论