SQLSERVER中collate的含义

我们在createtable时经常会碰到这样的语句,例如:passwordnvarchar(10)collatechinese_prc_ci_asnull,那它到底是什么意思呢?不妨看看下面:

首先,collate是一个子句,可应用于数据库定义或列定义以定义排序规则,或应用于字符串表达式以应用排序规则投影。

语法是collatecollation_name

collation_name::={windows_collation_name}|{sql_collation_name}

参数collate_name是应用于表达式、列定义或数据库定义的排序规则的名称。collation_name可以只是指定的Windows_collation_name或SQL_collation_name。

Windows_collation_name是Windows排序规则的排序规则名称。参见Windows排序规则名称。SQL_collation_name是SQL排序规则的排序规则名称。参见SQL排序规则名称。

下面简单介绍一下排序规则:

什么叫排序规则呢?MS是这样描述的:"在MicrosoftSQLServer2000中,字符串的物理存储由排序规则控制。排序规则指定表示每个字符的位模式以及存储和比较字符所使用的规则。"在查询分析器内执行下面语句,可以得到SQLSERVER支持的所有排序规则。

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区分

区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项,比较还将重音不同的字母视为不等。区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项

利用排序规则特点计算汉字笔划和取得拼音首字母

一.错误分析:这个错误是因为排序规则不一致造成的,我们做个测试,比如:createtable#t1(namevarchar(20)collateAlbanian_CI_AI_WS,valueint)

createtable#t2(namevarchar(20)collateChinese_PRC_CI_AI_WS,valueint)

表建好后,执行连接查询:

select*from#t1Ainnerjoin#t2BonA.name=B.name

这样,错误就出现了:

服务器:消息446,级别16,状态9,行1无法解决equalto操作的排序规则冲突。要排除这个错误,最简单方法是,表连接时指定它的排序规则,这样错误就不再出现了。语句这样写:

select*from#t1Ainnerjoin#t2BonA.name=B.namecollateChinese_PRC_CI_AI_WS

二.排序规则简介:

三.排序规则的应用:SQLSERVER提供了大量的WINDOWS和SQLSERVER专用的排序规则,但它的应用往往被开发人员所忽略。其实它在实践中大有用处。

例1:让表NAME列的内容按拼音排序:

createtable#t(idint,namevarchar(20))insert#tselect1,'中'unionallselect2,'国'unionallselect3,'人'unionallselect4,'阿'

select*from#torderbynamecollateChinese_PRC_CS_AS_KS_WSdroptable#t/*结果:idname-------------------------------4阿2国3人1中*/

例2:让表NAME列的内容按姓氏笔划排序:

createtable#t(idint,namevarchar(20))

insert#tselect1,'三'unionallselect2,'乙'unionallselect3,'二'unionallselect4,'一'unionallselect5,'十'select*from#torderbynamecollateChinese_PRC_Stroke_CS_AS_KS_WSdroptable#t/*结果:idname-------------------------------4一2乙3二5十1三*/

四.在实践中排序规则应用的扩展SQLSERVER汉字排序规则可以按拼音、笔划等排序,那么我们如何利用这种功能来处理汉字的一些难题呢?我现在举个例子:

用排序规则的特性计算汉字笔划

要计算汉字笔划,我们得先做准备工作,我们知道,WINDOWS多国汉字,UNICODE目前收录汉字共20902个。简体GBK码汉字UNICODE值从19968开始。首先,我们先用SQLSERVER方法得到所有汉字,不用字典,我们简单利用SQL语句就可以得到:

selecttop20902code=identity(int,19968,1)into#tfromsyscolumnsa,syscolumnsb

再用以下语句,我们就得到所有汉字,它是按UNICODE值排序的:

selectcode,nchar(code)asCNWordfrom#t

然后,我们用SELECT语句,让它按笔划排序。

selectcode,nchar(code)asCNWordfrom#torderbynchar(code)collateChinese_PRC_Stroke_CS_AS_KS_WS,code

结果:codeCNWord-----------------19968一20008丨20022丶20031丿20032乀20033乁20057乙20058乚20059乛20101亅19969丁..........

createtable#t1(idintidentity,codeint,cnwordnvarchar(2))

insert#t1(code,cnword)selectcode,nchar(code)asCNWordfrom#torderbynchar(code)collateChinese_PRC_Stroke_CS_AS_KS_WS,code

selectA.cnwordfrom#t1Aleftjoin#t1BonA.id=B.id-1andA.codewhereB.codeisnullorderbyA.id

得到36个汉字,每个汉字都是每种笔划数按Chinese_PRC_Stroke_CS_AS_KS_WS排序规则排序后的最后一个汉字:

亅阝马风龙齐龟齿鸩龀龛龂龆龈龊龍龠龎龐龑龡龢龝齹龣龥齈龞麷鸞麣龖龗齾齉龘

建汉字笔划表(TAB_HZBH):createtabletab_hzbh(idintidentity,cnwordnchar(1))--先插入前33个汉字inserttab_hzbhselecttop33A.cnwordfrom#t1Aleftjoin#t1BonA.id=B.id-1andA.codewhereB.codeisnullorderbyA.id--再加最后四个汉字setidentity_inserttab_hzbhongoinserttab_hzbh(id,cnword)select35,N'齾'unionallselect36,N'齉'unionallselect39,N'靐'unionallselect64,N'龘'gosetidentity_inserttab_hzbhoffgo

declare@anchar(1)set@a='国'selecttop1idfromtab_hzbhwherecnword>=@acollateChinese_PRC_Stroke_CS_AS_KS_WSorderbyid

上面所有准备过程,只是为了写下面这个函数,这个函数撇开上面建的所有临时表和固定表,为了通用和代码转移方便,把表tab_hzbh的内容写在语句内,然后计算用户输入一串汉字的总笔划:

--函数调用实例:selectdbo.fun_getbh('中华人民共和国'),dbo.fun_getbh('中華人民共和國')执行结果:笔划总数分别为39和46,简繁体都行。

用排序规则的特性得到汉字拼音首字母

用得到笔划总数相同的方法,我们也可以写出求汉字拼音首字母的函数。如下:

createfunctionfun_getPY(@strnvarchar(4000))returnsnvarchar(4000)asbegindeclare@wordnchar(1),@PYnvarchar(4000)set@PY=''whilelen(@str)>0beginset@word=left(@str,1)--如果非汉字字符,返回原字符set@PY=@PY+(casewhenunicode(@word)between19968and19968+20901then(selecttop1PYfrom(select'A'asPY,N'驁'aswordunionallselect'B',N'簿'unionallselect'C',N'錯'unionallselect'D',N'鵽'unionallselect'E',N'樲'unionallselect'F',N'鰒'unionallselect'G',N'腂'unionallselect'H',N'夻'unionallselect'J',N'攈'unionallselect'K',N'穒'unionallselect'L',N'鱳'unionallselect'M',N'旀'unionallselect'N',N'桛'unionallselect'O',N'漚'unionallselect'P',N'曝'unionallselect'Q',N'囕'unionallselect'R',N'鶸'unionallselect'S',N'蜶'unionallselect'T',N'籜'unionallselect'W',N'鶩'unionallselect'X',N'鑂'unionallselect'Y',N'韻'unionallselect'Z',N'咗')Twhereword>=@wordcollateChinese_PRC_CS_AS_KS_WSorderbyPYASC)else@wordend)set@str=right(@str,len(@str)-1)endreturn@PYend

--函数调用实例:selectdbo.fun_getPY('中华人民共和国'),dbo.fun_getPY('中華人民共和國')结果都为:ZHRMGHG

THE END
1.重要通知好消息~缙云校区图书馆开放时间延长了新闻通知为保障广大读者权益,减少物品占座现象,从12月16日开始,图书馆将继续在早上开馆、晚上闭馆清理所有楼层占位物品的基础上,增加清理占位物品频次,并在14:00、19:00清理超过1小时无人使用桌位的占位物品。所清理的物品暂放在各楼层电梯对面工作台,每天上午统一将清理物品转移至一楼失物招领处,每周五转移至图书馆6楼失物https://lib.cqmu.edu.cn/home/servicedetail/0/3175
2.科学网—什么样的研究型大学图书馆是好的图书馆?2024年12月10日,圕人堂发起“什么样的图书馆是好的图书馆?”话题。开篇为《什么样的图书馆是好的图书馆?》(https://blog.sciencenet.cn/blog-213646-1463641.html), “理一分殊:图书馆多样性与未来学术研讨会暨CADAL项目年会”,杨新涯先生作《初论以科学评价为导向图书馆治理体系现代化》报告,报告中提出什么https://blog.sciencenet.cn/home.php?mod=space&uid=213646&do=blog&id=1463801
3.重庆图书馆为了更好地做好馆外流动借阅服务工作,现将重庆图书馆2025年流动图书车服务安排敬告如下: 一、服务时间、地点 二、注意事项 欢迎广大读者前往流动图书车借阅,如有特殊情况,我馆将随时调整相关服务安排,敬请关注重庆图书馆官方网站了解最新动态信息,感谢您对我们的支持和理解! https://share.cqlib.cn/?q=node/21837
4.FirstSearch基本组数据库包涵盖多种文献类型,包括图书,硕博士库推荐 | FirstSearch基本组数据库包】 FirstSearch基本组数据库包涵盖多种文献类型,包括图书、硕博士论文、学术期刊、会议论文、百科全书、年鉴等;涵盖多个学科,如农业、商业、科学、技术、文学、医学、宗教、哲学、语言、法律、政治学、心理学、社会学、经济学、教育学、地理学、历史学、人类学、美术以及图书馆学https://weibo.com/1924039383/P4wuhExhx
5.GB/T13418—92《文字条目通用排序规则》(摘录)GB/T13418—92《文字条目通用排序规则》(摘录)1主题内容与适用范围本标准规定了汉字字符和非汉字字符排序通用的基本规则。本标准适用于各种名称(人名、团体名、国名、地名、题名、品名、物名、会议名等)、字词、目录、编号、代码、数字、年代等一切要求 [https://wap.cnki.net/qikan-SDTG504.040.html
6.分类号由什么组成?排序规则怎么看?分类号是我国对图书及文献的一种分类,如果掌握了这个分类排序的方法,就可以更快地找到想要的文献,据2022年最新的文献数据来看,分类号主要由下面几个部分组成,以下paperquery论文查重软件就为大家整理: 分类号由什么组成?排序规则怎么看? 分类和主题都是从文献知识内容的角度揭示和组织文献资料。分类法是按文献的学科知https://www.paperquery.com/news/10516.html
7.图书馆规则:外借书籍仅一层可用,需留意号码排序和房间名关于图书馆借书..今天才得知学校的图书馆除了一层的书籍可以外借,其余的书籍是不允许外借的,只能在那里看。给各位想去图书馆借书的人提个醒。还有,如果想要看书的话,可以先在学校官网网页下面的图书馆里面查书,然后书的编号前面https://tieba.baidu.com/p/8320766611
8.图书馆书库试卷2. 将分类号H319.4、H319.4:l712、H319.4-、H319.4:l512按图书排序规则正确的排序是( )。 A、 H319.4- → H319.4 →H319.4:l512 →H319.4:l712B、 H319.4 →H319.4:l512→H319.4:l712→H319.4-C、 H319.4 →H319.4- → H319.4:l512→H319.4:l712D、 H319.4 → H319.4- → H319.4:l712→ H319.https://www.wjx.cn/xz/259603097.aspx
9.信息工程大学学报杂志中国人民解放军信息工程大学主办《信息工程大学学报》杂志创办于2000年,,主要被知网收录(中)、维普收录(中)、万方收录(中)、SA 科学文摘(英)、剑桥科学文摘、国家图书馆馆藏、上海图书馆馆藏、数据库收录部级期刊,中国人民解放军信息工程大学主办的国家重点学术期刊,影响因子0.28,信息工程大学学报201https://www.youfabiao.com/xxgcdxxb/201903/
10.示范项目3、区县图书馆馆藏地点要求:馆藏地点名称:区县名称+馆藏地点名称 馆藏代码:区县大写字母排序+两位数字。如 未央自科图书借阅区 AF01;未央社科图书借阅区 AF02 4、区县图书馆分馆馆藏地点设置要求:馆藏地点名称:区县名称+街道(社区)乡镇(乡村)名称+馆藏地点名称 馆藏代码:区县图书馆编码+分馆编码+两位数字http://www.xalib.org.cn/info/73259.jspx
11.网易邮箱大师怎么设置分类,调整邮件排序规则网易邮箱大师怎么设置分类,调整邮件排序规则 在信息洪流中,你的邮箱是否也成了难以驾驭的小舟,被无尽的邮件浪潮淹没?别担心,今天咱们就来聊聊如何用“网易邮箱大师”这个神器,让你的邮箱管理变得井井有条,就像整理好书架的图书馆一样,一目了然!你是否曾幻想过,那些工作邮件、广告邮件、朋友私信能自动分类,不再混为https://www.duote.com/tech/202408/756965.html
12.幼儿园区域活动方案15篇1、尝试与同伴商量、制定游戏规则,并在游戏中自觉遵守规则。 2、乐意与同伴交流、分享自己感受到的夏天的季节变化。 活动内容: ※故事乐园: 图书馆:有关夏天的图书、自制小图书、图片资料。 故事表演小剧场:故事角色棒偶。 故事吧——绿太阳、小船悠悠、小土坑等 https://www.cnfla.com/huodongfangan/3268778.html
13.mysql:深究sql默认排序orderby腾讯云开发者社区mysql 语句中如果没有使用 order by 来排序,通常会用 主键正序排列,但是有的时候不是这样,来看一个实例。 实例 群友问:请教一个问题,mysql 默认排序问题,当sql 语句 的排序没有指定 主键(id)的时候是按着什么规则排序的呢? 这个sql 语句 当 hit_count = 0 和 uptime = 0 时 的数据和 跟 limit_count https://cloud.tencent.com/developer/article/1559490
14.中华人民共和国标准地名词典根据《地名分类与类别代码编制规则》(GB/T18521-2001)和《第二次全国地名普查工作规程》第八条地理实体的相关信息,自然地理实体类地名分为陆地地形、水系和海域三个大类及若干中类、小类。 考虑到词典的性质、特点、容量和实用性,对本词典第二部分自然地理实体地名的采词,具体要求如下: http://www.zgdmw.info/detail/20102216101059
15.按照中国图书馆分类法,下列分类号排序正确的是()按照中国图书馆分类法,下列分类号排序正确的是()A.I247.3 I267.1 I712.45B.B844.5 A41 C93C.C933 F270 F272D.F276 B82 F830的答案是什么.用刷刷题APP,拍照搜索答疑.刷刷题(shuashuati.com)是专业的大学职业搜题找答案,刷题练习的工具.一键将文档转化为在线题库手机刷题,https://www.shuashuati.com/ti/4843dbe7aefd44a99f9a341be7162fc7.html
16.图书馆信息管理系统voidmakeMenu(){printf("---\n");printf("gdut图书馆里系统\n");printf("\t0.退出系统\n");printf("\t1.登记书籍\n");printf("\t2.浏览书籍\n");printf("\t3.借阅书籍\n");printf("\t4.归还书籍\n");printf("\t5.书籍排序\n");printf("\t6.删除书籍\n");printf("\t7.查找书籍\n")https://www.jianshu.com/p/d78b72a7f915