国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > 綜合 > 正文

利用排序規(guī)則特點(diǎn)計(jì)算漢字筆劃和取得拼音首字母

2024-07-21 02:03:59
字體:
供稿:網(wǎng)友
  SQL SERVER的排序規(guī)則平時(shí)使用不是很多,也許不少初學(xué)者還比較陌生,但有
一個(gè)錯(cuò)誤大家應(yīng)是經(jīng)常碰到: SQL SERVER數(shù)據(jù)庫(kù),在跨庫(kù)多表連接查詢時(shí),若兩數(shù)據(jù)
庫(kù)默認(rèn)字符集不同,系統(tǒng)就會(huì)返回這樣的錯(cuò)誤:
      
           “無法解決 equal to 操作的排序規(guī)則沖突。”

一.錯(cuò)誤分析:
  這個(gè)錯(cuò)誤是因?yàn)榕判蛞?guī)則不一致造成的,我們做個(gè)測(cè)試,比如:
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 )

表建好后,執(zhí)行連接查詢:

select * from #t1 A inner join #t2 B on A.name=B.name

這樣,錯(cuò)誤就出現(xiàn)了:

           服務(wù)器: 消息 446,級(jí)別 16,狀態(tài) 9,行 1
           無法解決 equal to 操作的排序規(guī)則沖突。
  要排除這個(gè)錯(cuò)誤,最簡(jiǎn)單方法是,表連接時(shí)指定它的排序規(guī)則,這樣錯(cuò)誤就
不再出現(xiàn)了。語(yǔ)句這樣寫:

select *
from #t1 A inner join #t2 B
on A.name=B.name collate Chinese_PRC_CI_AI_WS


二.排序規(guī)則簡(jiǎn)介:

    什么叫排序規(guī)則呢?MS是這樣描述的:"在 Microsoft SQL Server 2000 中,
字符串的物理存儲(chǔ)由排序規(guī)則控制。排序規(guī)則指定表示每個(gè)字符的位模式以及存
儲(chǔ)和比較字符所使用的規(guī)則。"
  在查詢分析器內(nèi)執(zhí)行下面語(yǔ)句,可以得到SQL SERVER支持的所有排序規(guī)則。

    select * from ::fn_helpcollations()

排序規(guī)則名稱由兩部份構(gòu)成,前半部份是指本排序規(guī)則所支持的字符集。
如:
  Chinese_PRC_CS_AI_WS
前半部份:指UNICODE字符集,Chinese_PRC_指針對(duì)大陸簡(jiǎn)體字UNICODE的排序規(guī)則。
排序規(guī)則的后半部份即后綴 含義:
  _BIN 二進(jìn)制排序
  _CI(CS) 是否區(qū)分大小寫,CI不區(qū)分,CS區(qū)分
  _AI(AS) 是否區(qū)分重音,AI不區(qū)分,AS區(qū)分   
  _KI(KS) 是否區(qū)分假名類型,KI不區(qū)分,KS區(qū)分 
    _WI(WS) 是否區(qū)分寬度 WI不區(qū)分,WS區(qū)分 

區(qū)分大小寫:如果想讓比較將大寫字母和小寫字母視為不等,請(qǐng)選擇該選項(xiàng)。
區(qū)分重音:如果想讓比較將重音和非重音字母視為不等,請(qǐng)選擇該選項(xiàng)。如果選擇該選項(xiàng),
         比較還將重音不同的字母視為不等。
區(qū)分假名:如果想讓比較將片假名和平假名日語(yǔ)音節(jié)視為不等,請(qǐng)選擇該選項(xiàng)。
區(qū)分寬度:如果想讓比較將半角字符和全角字符視為不等,請(qǐng)選擇該選項(xiàng)


三.排序規(guī)則的應(yīng)用:
  SQL SERVER提供了大量的WINDOWS和SQLSERVER專用的排序規(guī)則,但它的應(yīng)用往往
被開發(fā)人員所忽略。其實(shí)它在實(shí)踐中大有用處。

  例1:讓表NAME列的內(nèi)容按拼音排序:

create table #t(id int,name varchar(20))
insert #t select 1,'中'
union all select 2,'國(guó)'
union all select 3,'人'
union all select 4,'阿'

select * from #t order by name collate Chinese_PRC_CS_AS_KS_WS
drop table #t
/*結(jié)果:
id          name                
----------- --------------------
4           阿
2           國(guó)
3           人
1           中
*/

  例2:讓表NAME列的內(nèi)容按姓氏筆劃排序:

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
/*結(jié)果:
id          name                
----------- --------------------
4           一
2           乙
3           二
5           十
1           三
*/

四.在實(shí)踐中排序規(guī)則應(yīng)用的擴(kuò)展
  SQL SERVER漢字排序規(guī)則可以按拼音、筆劃等排序,那么我們?nèi)绾卫眠@種功能
來處理漢字的一些難題呢?我現(xiàn)在舉個(gè)例子:

          用排序規(guī)則的特性計(jì)算漢字筆劃

  要計(jì)算漢字筆劃,我們得先做準(zhǔn)備工作,我們知道,WINDOWS多國(guó)漢字,UNICODE目前
收錄漢字共20902個(gè)。簡(jiǎn)體GBK碼漢字UNICODE值從19968開始。
  首先,我們先用SQLSERVER方法得到所有漢字,不用字典,我們簡(jiǎn)單利用SQL語(yǔ)句就
可以得到:

select top 20902 code=identity(int,19968,1) into #t from syscolumns a,syscolumns b

再用以下語(yǔ)句,我們就得到所有漢字,它是按UNICODE值排序的:

  select code,nchar(code) as CNWord from #t

  然后,我們用SELECT語(yǔ)句,讓它按筆劃排序。

select code,nchar(code) as CNWord
from #t
order by nchar(code) collate Chinese_PRC_Stroke_CS_AS_KS_WS,code

結(jié)果:
code        CNWord
----------- ------
19968       一
20008       丨
20022       丶
20031       丿
20032      

主站蜘蛛池模板: 德令哈市| 修文县| 商丘市| 武平县| 卢湾区| 辉南县| 河北区| 三门峡市| 江都市| 磐安县| 安溪县| 望城县| 潼关县| 富顺县| 浠水县| 九江县| 锡林郭勒盟| 赫章县| 宾川县| 南宁市| 樟树市| 论坛| 石渠县| 哈巴河县| 金昌市| 赤城县| 崇义县| 东山县| 延寿县| 静安区| 饶阳县| 姚安县| 黑水县| 莒南县| 郸城县| 新泰市| 张家口市| 汉阴县| 青浦区| 驻马店市| 庆安县|