SQL Server数据库查询区分大小写、全半角——排序规则的应用(转载)
SQL Server數(shù)據(jù)庫(kù)查詢區(qū)分大小寫、全半角——排序規(guī)則的應(yīng)用
因?yàn)榕既坏脑?#xff0c;需要在INNER JOIN聯(lián)表時(shí),讓對(duì)應(yīng)字段進(jìn)行區(qū)分大小寫的比較。而默認(rèn)情況下建立的Sql Server數(shù)據(jù)庫(kù)是不區(qū)分大小寫的,這個(gè)需求怎么實(shí)現(xiàn)呢?
要實(shí)現(xiàn)這個(gè)需求,至少有三個(gè)操作級(jí)別來實(shí)現(xiàn):
1.?數(shù)據(jù)庫(kù)級(jí)別:整個(gè)數(shù)據(jù)庫(kù)中的char、varchar、text、nchar、nvarchar?和?ntext?數(shù)據(jù)都區(qū)分大小寫。(為描述方便,下文不再明確強(qiáng)調(diào)這些數(shù)據(jù)類型。)但這樣做有個(gè)明顯的壞處,那就是整個(gè)數(shù)據(jù)庫(kù)的這些字段的比較,都要進(jìn)行嚴(yán)格匹配。比如下面的兩條Sql語句會(huì)得到完全不同的兩種結(jié)果:
SELECT * FROM [TABLE] WHERE [COLUMN] LIKE ‘%KeyWord%’ SELECT * FROM [TABLE] WHERE [COLUMN] LIKE ‘%keyword%’因?yàn)閿?shù)據(jù)庫(kù)在比較時(shí)會(huì)嚴(yán)格按照大小寫來區(qū)別,這樣就會(huì)導(dǎo)致我們?cè)诔绦蜷_發(fā)過程中難以滿足十分復(fù)雜的查詢需求,特別突出的例子便是關(guān)鍵字搜索——我們無法預(yù)知客戶輸入內(nèi)容的大小寫,我們更不能要求客戶輸入的關(guān)鍵字區(qū)分大小寫。
2.?表字段級(jí)別:只對(duì)特定的表字段進(jìn)行大小寫區(qū)分。這樣做在整體上減小了大小寫限定的范圍,從全數(shù)據(jù)庫(kù)減小到當(dāng)前指定的字段。但使用起來仍然有些局限性。
3.?查詢級(jí)別:只對(duì)本次查詢限定大小寫區(qū)分。這也是本文重點(diǎn)介紹的實(shí)現(xiàn)方式。這樣操作可以讓我們不對(duì)以前的數(shù)據(jù)庫(kù)做任何的修改,只對(duì)當(dāng)前這次查詢區(qū)分大小寫,也不會(huì)影響程序中別處對(duì)這些字段的查詢。
好了,上文說了三個(gè)實(shí)現(xiàn)級(jí)別,那具體怎么實(shí)現(xiàn)呢?這就要用到SQL數(shù)據(jù)庫(kù)中的“排序規(guī)則”了。我們可以在數(shù)據(jù)庫(kù)的屬性上,設(shè)置排序規(guī)則,也可以在表設(shè)計(jì)的字段屬性里設(shè)置排序規(guī)則。具體要設(shè)置什么樣的排序規(guī)則,后面來說,我們先說查詢級(jí)別的排序規(guī)則。下面有一段SQL片段可以演示在查詢級(jí)別區(qū)分大小寫的排序規(guī)則應(yīng)用:
use tempdb set nocount on --1-- print '建立初始數(shù)據(jù)表Customer' create table Customer(id int,uname varchar(10)) insert into Customer select 1,'Jim' union all select 2,'Simith' union all select 3,'uonun'select * from Customer--2-- print '建立初始數(shù)據(jù)表Info' create table Info(uname varchar(10),phone varchar(11)) insert into Info select 'JIM','13800000000' union all select 'Simith','13911111111' union all select 'uonun','13812345678'select * from Info--3-- print '不區(qū)分大小寫,不區(qū)分全半角' select c.id,c.uname as 'c.uname',i.uname as 'i.uname',i.phone from Customer as c inner join Info as i on c.uname = i.uname--4-- print '區(qū)分大小寫,不區(qū)分全半角' select c.id,c.uname as 'c.uname',i.uname as 'i.uname',i.phone from Customer as c inner join Info as i on c.uname = i.uname collate Chinese_PRC_CS_AS--5-- print '不區(qū)分大小寫,區(qū)分全半角' select c.id,c.uname as 'c.uname',i.uname as 'i.uname',i.phone from Customer as c inner join Info as i on c.uname = i.uname collate Chinese_PRC_CI_AI_WS--6-- print '區(qū)分大小寫,區(qū)分全半角' select c.id,c.uname as 'c.uname',i.uname as 'i.uname',i.phone from Customer as c inner join Info as i on c.uname = i.uname collate Chinese_PRC_CS_AI_WSDROP TABLE Customer DROP TABLE Info/* 建立初始數(shù)據(jù)表Customer id uname ----------- ---------- 1 Jim 2 Simith 3 uonun建立初始數(shù)據(jù)表Info uname phone ---------- ----------- JIM 13800000000 Simith 13911111111 uonun 13812345678不區(qū)分大小寫,不區(qū)分全半角 id c.uname i.uname phone ----------- ---------- ---------- ----------- 1 Jim JIM 13800000000 2 Simith Simith 13911111111 3 uonun uonun 13812345678區(qū)分大小寫,不區(qū)分全半角 id c.uname i.uname phone ----------- ---------- ---------- ----------- 2 Simith Simith 13911111111 3 uonun uonun 13812345678不區(qū)分大小寫,區(qū)分全半角 id c.uname i.uname phone ----------- ---------- ---------- ----------- 1 Jim JIM 13800000000 3 uonun uonun 13812345678區(qū)分大小寫,區(qū)分全半角 id c.uname i.uname phone ----------- ---------- ---------- ----------- 3 uonun uonun 13812345678 */通過上面的SQL語句可以看出,我們?cè)诓樵儠r(shí)使用COLLATE字句,指定排序規(guī)則可以影響查詢結(jié)果。通過上面的圖也可以看出,這個(gè)排序規(guī)則除可以區(qū)分大小寫之外,還可以區(qū)分重音、假名、全半角。
結(jié)束語:
?
原文地址:http://blog.udnz.com/Article/use-COLLATE-in-Transact-SQL.aspx
轉(zhuǎn)載于:https://www.cnblogs.com/RoseDavid/archive/2012/10/19/2730635.html
總結(jié)
以上是生活随笔為你收集整理的SQL Server数据库查询区分大小写、全半角——排序规则的应用(转载)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue中render: h = h(Ap
- 下一篇: linux cmake编译源码,linu