亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

講解SQL 2000的Collection排序規則

2024-07-21 02:41:59
字體:
來源:轉載
供稿:網友
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  B  on  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_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.code<B.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<B.code  where  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  id  from    tab_hzbh  where  cnword>=@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,簡繁體都行。

當然,你也可以把上面“UNION ALL”內的漢字和筆劃改存在固定表內,在漢字列建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

大家如果有興趣,可以使用相同的方法,擴展得到漢字全拼的函數,甚至你還可以得到全拼的讀音聲調,不過全拼分類大多了。得到全拼最好還是用對照表,兩萬多漢字搜索速度顯然很快,另外,用對照表還可以充分利用表的索引。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲色图偷窥自拍| 亚洲国产精品成人一区二区| 色yeye香蕉凹凸一区二区av| 中文字幕不卡在线视频极品| 欧美大片在线看免费观看| 欧美视频13p| 亚洲无限av看| xxxx性欧美| 欧美激情在线狂野欧美精品| 欧美成人午夜免费视在线看片| 日韩欧美中文在线| 日本精品va在线观看| 日韩成人在线免费观看| 欧美激情精品久久久久| 在线观看精品国产视频| 日本国产精品视频| 九九精品在线观看| 亚洲影院色无极综合| 青青草原一区二区| 国产亚洲欧美另类中文| 自拍偷拍亚洲在线| 亚洲成av人影院在线观看| 欧美精品在线免费| 亚洲二区在线播放视频| 精品高清一区二区三区| 中文字幕av一区二区| 亚洲欧美自拍一区| 大桥未久av一区二区三区| 国产精品成人v| 成人黄色在线免费| 国产成人av在线| 成人自拍性视频| 啊v视频在线一区二区三区| 久久久欧美一区二区| 欧美日韩在线影院| 精品国产91乱高清在线观看| 热久久免费视频精品| 91wwwcom在线观看| 欧美又大粗又爽又黄大片视频| 国产福利精品av综合导导航| 欧美激情久久久| 亚洲欧美国产制服动漫| 欧美成人久久久| 欧美野外wwwxxx| 午夜剧场成人观在线视频免费观看| 欧美国产一区二区三区| 日韩在线视频导航| 日韩精品视频观看| 欧美成人免费播放| 日韩国产欧美精品一区二区三区| 欧美在线激情网| 亚洲天堂免费观看| 亚洲第一视频网| 尤物九九久久国产精品的特点| 亚洲毛片在线观看.| 国内精品一区二区三区| 欧美电影免费播放| 亚洲国产欧美一区二区三区久久| 国产亚洲精品美女| 亚洲国产成人在线播放| 欧美日韩福利电影| 欧美性在线视频| 久久精品久久久久| 精品成人久久av| 2018日韩中文字幕| 中文字幕国产亚洲| 91精品久久久久| 国产成人一区二区三区| 欧美在线亚洲在线| 欧美午夜片欧美片在线观看| 国产精品久久久亚洲| 欧美天天综合色影久久精品| 国产精品情侣自拍| 国产99久久精品一区二区永久免费| 丝袜美腿亚洲一区二区| 538国产精品视频一区二区| 在线视频亚洲欧美| 欧美成人国产va精品日本一级| 亚洲自拍小视频| 久久久久久91| 两个人的视频www国产精品| 日韩av在线高清| 国产精品678| 国产69精品99久久久久久宅男| 国产成人免费av| 亚洲日韩欧美视频一区| 一本一本久久a久久精品牛牛影视| 日韩男女性生活视频| 夜夜躁日日躁狠狠久久88av| 久热精品视频在线免费观看| 国产亚洲人成网站在线观看| 亚洲精品色婷婷福利天堂| 日韩免费中文字幕| 亚洲aⅴ男人的天堂在线观看| 在线视频免费一区二区| 欧美中文字幕精品| 亚洲精品国产suv| 日韩风俗一区 二区| 欧美激情欧美激情在线五月| 日韩av在线影院| 久久久久一本一区二区青青蜜月| 欧美国产视频一区二区| 国产不卡在线观看| 亚洲成人久久久久| 欧美中文在线观看| 日韩精品中文字幕视频在线| 日韩高清人体午夜| 色一情一乱一区二区| 国产精品老女人精品视频| 亚洲欧洲国产精品| 久久综合免费视频| 黄网动漫久久久| 在线免费看av不卡| 欧美精品aaa| 国产精品稀缺呦系列在线| 国产成人一区二区三区小说| 在线丨暗呦小u女国产精品| 亚洲国产欧美一区二区三区同亚洲| 欧美刺激性大交免费视频| 日韩欧美亚洲综合| 奇门遁甲1982国语版免费观看高清| 精品偷拍一区二区三区在线看| 亚洲精品videossex少妇| 57pao精品| 亚洲男人天堂手机在线| 深夜成人在线观看| 2019av中文字幕| 国产精品日日摸夜夜添夜夜av| 国产精品国产福利国产秒拍| 亚洲电影免费观看高清完整版| 在线看日韩av| 欧美一区亚洲一区| 欧美香蕉大胸在线视频观看| 欧美激情按摩在线| 欧美另类交人妖| 97精品国产97久久久久久春色| 欧美性69xxxx肥| 日韩av免费在线播放| 91av福利视频| 国产成人久久精品| 亚洲午夜激情免费视频| 久久国产天堂福利天堂| 色噜噜亚洲精品中文字幕| 亚洲性猛交xxxxwww| 81精品国产乱码久久久久久| 久久免费成人精品视频| 日韩在线视频网站| 91大神在线播放精品| 亚洲香蕉在线观看| 国产91色在线播放| 精品福利视频导航| 亚洲精品中文字幕av| 九九热这里只有精品免费看| 主播福利视频一区| 在线电影欧美日韩一区二区私密| 亚洲成人免费在线视频| 国产成人jvid在线播放| 日韩欧美国产成人| 国产精品美女主播在线观看纯欲| 国精产品一区一区三区有限在线| www高清在线视频日韩欧美| 成人网在线视频| 亚洲字幕在线观看| 久久久久久久国产精品视频|