好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

正确理解collateChinesePRCCIAS.docx

18页
  • 卖家[上传人]:平***
  • 文档编号:10894565
  • 上传时间:2017-10-11
  • 文档格式:DOCX
  • 文档大小:22.30KB
  • / 18 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 正确理解 collate Chinese_PRC_CI_AS我们在 create table 时经常会碰到这样的语句,例如:password nvarchar(10)collate chinese_prc_ci_as null,那它到底是什么意思呢?不妨看看下面:首先,collate 是一个子句,可应用于数据库定义或列定义以定义排序规则,或应用于字符串表达式以应用排序规则投影语法是 collate collation_name下面简单介绍一下排序规则:什么叫排序规则呢?MS 是这样描述的:"在 Microsoft SQL Server 2000 中,字符串的物理存储由排序规则控制排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则"在查询分析器内执行下面语句,可以得到 SQL SERVER 支持的所有排序规则select * from ::fn_helpcollations()排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集如:  Chinese_PRC_CS_AI_WS前半部份:指 UNICODE 字符集,Chinese_PRC_指针对大陆简体字UNICODE 的排序规则。

      排序规则的后半部份即后缀 含义: _BIN 二进制排序 _CI(CS) 是否区分大小写,CI 不区分,CS 区分_AI(AS) 是否区分重音,AI 不区分,AS 区分   _KI(KS) 是否区分假名类型,KI 不区分,KS 区分 _WI(WS) 是否区分宽度 WI 不区分,WS 区分 区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项如果选择该选项,比较还将重音不同的字母视为不等区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项利用排序规则特点计算汉字笔划和取得拼音首字母SQL SERVER 的排序规则平时使用不是很多,也许不少初学者还比较陌生,但有一个错误大家应是经常碰到: SQL SERVER 数据库,在跨库多表连接查询时,若两数据库默认字符集不同,系统就会返回这样的错误:“无法解决 equal to 操作的排序规则冲突一.错误分析:这个错误是因为排序规则不一致造成的,我们做个测试,比如:create table #t1(name varchar(20) collate Albanian_CI_AI_WS, value int)create table #t2(name varchar(20) collate Chinese_PRC_CI_AI_WS, value int )表建好后,执行连接查询:select * from #t1 A inner join #t2 B on A.name=B.name这样,错误就出现了: 服务器: 消息 446,级别 16,状态 9,行 1无法解决 equal to 操作的排序规则冲突。

      要排除这个错误,最简单方法是,表连接时指定它的排序规则,这样错误就不再出现了语句这样写:select *from #t1 A inner join #t2 Bon A.name=B.name collate Chinese_PRC_CI_AI_WS二.排序规则简介:什么叫排序规则呢?MS 是这样描述的:"在 Microsoft SQL Server 2000 中,字符串的物理存储由排序规则控制排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则"在查询分析器内执行下面语句,可以得到 SQL SERVER 支持的所有排序规则select * from ::fn_helpcollations()排序规则名称由两部份构成,前半部份是指本排序规则所支持的字符集如:Chinese_PRC_CS_AI_WS前半部份:指 UNICODE 字符集,Chinese_PRC_指针对大陆简体字UNICODE 的排序规则排序规则的后半部份即后缀 含义:_BIN 二进制排序_CI(CS) 是否区分大小写,CI 不区分,CS 区分_AI(AS) 是否区分重音,AI 不区分,AS 区分   _KI(KS) 是否区分假名类型,KI 不区分,KS 区分 _WI(WS) 是否区分宽度 WI 不区分,WS 区分 区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。

      区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项如果选择该选项,比较还将重音不同的字母视为不等区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项三.排序规则的应用:  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 A.cnwordfrom #t1 Aleft join #t1 B on A.id=B.id-1 and A.codewhere 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.cnwordfrom #t1 Aleft join #t1 B on A.id=B.id-1 and A.codewhere B.code is nullorder by A.id--再加最后四个汉字set identity_insert tab_hzbh ongoinsert tab_hzbh(id,cnword)select 35,N'齾'union all select 36,N'齉'union all select 39,N'靐'union all select 64,N'龘'goset identity_insert tab_hzbh offgo到此为止,我们可以得到结果了,比如我们想得到汉字“国”的笔划:declare @a nchar(1)set @a='国'select top 1 idfrom tab_hzbhwhere cnword>=@a collate Chinese_PRC_Stroke_CS_AS_KS_WSorder by idid -----------8(结果:汉字“国”笔划数为 8)上面所有准备过程,只是为了写下面这个函数,这个函数撇开上面建的所有临时表和固定表,为了通用和代码转移方便,把表 tab_hzbh 的内容写在语句内,然后计算用户输入一串汉字的总笔划:create function fun_g。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.