“無法解決 equal to 操作的排序規則沖突?!?
一、錯誤分析:
這個錯誤是因為排序規則不一致造成的,測試如下:
|
表建好后,再來執行連接查詢:
|
此時,錯誤就出現了:
服務器: 消息 446,級別 16,狀態 9,行 1
無法解決 equal to 操作的排序規則沖突。
要排除這個錯誤,最簡單方法是,表連接時指定它的排序規則,這樣錯誤就不再出現了。語句這樣寫:
|
二.排序規則簡介:
什么叫排序規則呢?MS是這樣描述的:"在 Microsoft SQL Server 2000 中,字符串的物理存儲由排序規則控制。排序規則指定表示每個字符的位模式以及存儲和比較字符所使用的規則。"在查詢分析器內執行下面語句,可以得到SQL SERVER支持的所有排序規則。
|
排序規則名稱由兩部份構成,前半部份是指本排序規則所支持的字符集。如:
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列的內容按拼音排序:
|
例2:讓表NAME列的內容按姓氏筆劃排序:
create table #t(id int,name varchar(20))
|
/*結果:
|
四.在實踐中排序規則應用的擴展
SQL Server漢字排序規則可以按拼音、筆劃等排序,那么我們如何利用這種功能來處理漢字的一些難題呢?我現在舉個例子: 用排序規則的特性計算漢字筆劃
要計算漢字筆劃,我們得先做準備工作,我們知道,WINDOWS多國漢字,UNICODE目前收錄漢字共20902個。簡體GBK碼漢字UNICODE值從19968開始。
首先,我們先用SQLSERVER方法得到所有漢字,不用字典,我們簡單利用SQL語句就可以得到:
|
再用以下語句,我們就得到所有漢字,它是按UNICODE值排序的:
|
結果:
|
從上面的結果,我們可以清楚的看到,一筆的漢字,code是從19968到20101,從小到大排,但到了二筆漢字的第一個字“丁”,CODE為19969,就不按順序而重新開始了。有了這結果,我們就可以輕松的用SQL語句得到每種筆劃漢字歸類的第一個或最后一個漢字。
下面用語句得到最后一個漢字:
|
得到36個漢字,每個漢字都是每種筆劃數按Chinese_PRC_Stroke_CS_AS_KS_WS排序規則排序后的最后一個漢字:
亅阝馬風龍齊龜齒鴆齔龕龂齠齦齪龍龠龎龐龑龡龢龝齹龣龥齈龞麷鸞麣龖龗齾齉龘
上面可以看出:“亅”是所有一筆漢字排序后的最后一個字,“阝”是所有二筆漢字排序后的最后一個字......等等。
但同時也發現,從第33個漢字“龗(33筆)”后面的筆劃有些亂,不正確。但沒關系,比“龗”筆劃多的只有四個漢字,我們手工加上:齾35筆,齉36筆,靐39筆,龘64筆
建漢字筆劃表(TAB_HZBH):
|
到此為止,我們可以得到結果了,比如我們想得到漢字“國”的筆劃:
|
上面所有準備過程,只是為了寫下面這個函數,這個函數撇開上面建的所有臨時表和固定表,為了通用和代碼轉移方便,把表tab_hzbh的內容寫在語句內,然后計算用戶輸入一串漢字的總筆劃:
|
函數調用實例:
select dbo.fun_getbh('中華人民共和國'),dbo.fun_getbh('中華人民共和國')
執行結果:筆劃總數分別為39和46,簡繁體都行。
當然,你也可以把上面“UNION ALL”內的漢字和筆劃改存在固定表內,在漢字列建CLUSTERED INDEX,列排序規則設定為:
Chinese_PRC_Stroke_CS_AS_KS_WS
這樣速度更快。如果你用的是BIG5碼的操作系統,你得另外生成漢字,方法一樣。但有一點要記住:這些漢字是通過SQL語句Select出來的,不是手工輸入的,更不是查字典得來的,因為新華字典畢竟不同于UNICODE字符集,查字典的結果會不正確?! ?
用排序規則的特性得到漢字拼音首字母
用得到筆劃總數相同的方法,我們也可以寫出求漢字拼音首字母的函數。如下:
|
函數調用實例:
select dbo.fun_getPY('中華人民共和國'),dbo.fun_getPY('中華人民共和國')
結果都是:ZHRMGHG
大家如果有興趣,可以使用相同的方法,擴展得到漢字全拼的函數,甚至你還可以得到全拼的讀音聲調,不過全拼分類大多了。得到全拼最好還是用對照表,兩萬多漢字搜索速度顯然很快,另外,用對照表還可以充分利用表的索引。
新聞熱點
疑難解答