(轉)sql server 排序規則


轉自:https://www.cnblogs.com/suizhikuo/p/4362605.html

/*   
排序規則根據特定語言和區域設置的標准指定對  字符串  數據 進行排序和比較的規則。   
以 ORDER BY 子句為例:如果按升序排列,說英語的人認為字符串 Chiapas 應排在 Colima 之前。   
但是,對於在墨西哥說西班牙語的人來說,他們會認為以 Ch 開頭的單詞應顯示在以 C 開頭的單詞列表的末尾。   
排序規則規定了這些排序和比較規則。Latin_1 General 排序規則在 ORDER BY ASC 子句中將 Chiapas 排在 Colima 之前,   
而 Traditional_Spanish 排序規則將 Chiapas 排在 Colima 之后。   
排序規則名稱由兩部份構成,前半部份是指本排序規則所支持的字符集。     
如:     
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區分      
區分大小寫:如果想讓比較將大寫字母和小寫字母視為不等,請選擇該選項。     
區分重音:如果想讓比較將重音和非重音字母視為不等,請選擇該選項。如果選擇該選項,比較還將重音不同的字母視為不等。     
區分假名:如果想讓比較將片假名和平假名日語音節視為不等,請選擇該選項。     
區分寬度:如果想讓比較將半角字符和全角字符視為不等,請選擇該選項。     
修改排序規則     
如果是數據庫:ALTER DATABASE 數據庫名 COLLATE 排列規則     
ALTER DATABASE test COLLATE Chinese_PRC_CI_AI    
如果是表中的字段:ALTER TABLE 表名 ALTER COLUMN 字段名 數據類型(長度) COLLATE 排列規則     
ALTER TABLE test ALTER COLUMN name varchar(10) COLLATE Chinese_PRC_CI_AI    
*/ 
--所有排序規則      
SELECT  * FROM    :: FN_HELPCOLLATIONS()       
-----------------------------------------------------------------------------------      
--1.為數據庫指定排序規則      
CREATE DATABASE test1 COLLATE Chinese_PRC_CI_AS       
GO      
CREATE DATABASE test2 COLLATE Chinese_Hong_Kong_Stroke_90_CI_AI      
GO      
USE test1     
go      
CREATE TABLE a  
    (  
      col1 VARCHAR(10) ,  
      col2 VARCHAR(10)  
    )      
INSERT INTO a  
SELECT  'a1' , 'a2'  
UNION ALL  
SELECT  'a3' , 'a4'     
GO      
---------------  
USE test2     
go      
CREATE TABLE a  
    (  
      col1 VARCHAR(10) ,  
      col2 VARCHAR(10)  
    )      
GO      
INSERT INTO a  
SELECT  'a1' , 'a2'  
UNION ALL  
SELECT  'a5' , 'a6'     
-----------------  
SELECT  * FROM    test1.dbo.a      
SELECT  * FROM    test2.dbo.a      
--轉換規則,語句執行無錯    
SELECT  *  FROM    test1.dbo.a aa , test2.dbo.a bb  
WHERE   aa.col1 = bb.col1 COLLATE Chinese_PRC_CI_AS      
SELECT  * FROM    test1.dbo.a aa , test2.dbo.a bb  
WHERE   aa.col1 = bb.col1   --這句單獨執行,出錯 ,無法解決 equal to 操作中 "Chinese_Hong_Kong_Stroke_90_CI_AI" 和 "Chinese_PRC_CI_AS" 之間的排序規則沖突。      
--排序規則不一樣,無法比較字符串 ,字段,需要轉換規則.使其一致,好比2個人做比較,誰厲害點,指定一個規則,如這2個人sql方面做比較  
USE master      
go      
DROP DATABASE test1     
go      
DROP DATABASE test2     
-----------------------------------------------------------------------------------     
--2.為表中的列指定排序規則      
CREATE TABLE #t1  
    (  
      col1 VARCHAR(10) ,  
      col2 VARCHAR(10) COLLATE Chinese_PRC_CI_AS  
    )      
GO      
INSERT INTO #t1  
SELECT  'a1' ,'a2'  
UNION ALL  
SELECT  'a3' ,'a4'     
CREATE TABLE #t2  
    (  
      col1 VARCHAR(10) ,  
      col2 VARCHAR(10) COLLATE Chinese_Hong_Kong_Stroke_90_CI_AI  
    )      
GO      
INSERT INTO #t2  
SELECT  'a1' ,'a2'  
UNION ALL  
SELECT  'a3' ,'a4'     
SELECT  * FROM    #t1     
SELECT  * FROM    #t2     
--沒錯誤      
SELECT  * FROM    #t1 aa JOIN #t2 bb ON aa.col1 = bb.col1     
--轉換規則      
SELECT  * FROM    #t1 aa , #t2 bb  WHERE   aa.col2 = bb.col2 COLLATE Chinese_PRC_CI_AS      
SELECT  *  
FROM    #t1  JOIN #t2 ON #t1.col2 = #t2.col2  --出錯,無法解決 equal to 操作中 "Chinese_Hong_Kong_Stroke_90_CI_AI" 和 "Chinese_PRC_CI_AS" 之間的排序規則沖突。      
DROP TABLE #t1     
DROP TABLE #t2     
-----------------------------------------------------------------------------------      
--3.為字符變量指定排序規則      
DECLARE @a VARCHAR(10) ,  
    @b VARCHAR(10)    
SELECT  @a = 'a' ,  
        @b = 'A'    
--使用排序規則 Chinese_PRC_CI_AS    
SELECT  CASE WHEN @a COLLATE Chinese_PRC_CI_AS = @b THEN '@a=@b'  
ELSE '@a<>@b'  
END 
--結果:@a=@b    
--使用排序規則 Chinese_PRC_BIN    
SELECT  CASE WHEN @a COLLATE Chinese_PRC_BIN = @b THEN '@a=@b'  
ELSE '@a<>@b'  
END 
--結果:@a<>@b    
SELECT  @a   
SELECT  @b   
--按筆畫姓氏查詢   
SELECT  * FROM    TableName  ORDER BY CustomerName COLLATE Chinese_PRC_Stroke_ci_as        
-----------------------------------------------------------------------------------    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM