定義:在 Microsoft SQL Server 中,字符串的物理存儲由排序規則控制。排序規則指定表示每個字符的位模式以及存儲和比較字符所使用的規則。
在查詢分析器內執行下面語句,可以得到SQL SERVER支持的所有排序規則。
select * from ::fn_helpcollations()
返回結果:
NAME |
DESCRIPTION |
Chinese_Hong_Kong_Stroke_90_BIN |
Chinese-Hong-Kong-Stroke-90, binary sort |
Chinese_Hong_Kong_Stroke_90_BIN2 |
Chinese-Hong-Kong-Stroke-90, binary code point comparison sort |
Chinese_Hong_Kong_Stroke_90_CI_AI |
Chinese-Hong-Kong-Stroke-90, case-insensitive, accent-insensitive, kanatype-insensitive, width-insensitive |
Chinese_Hong_Kong_Stroke_90_CI_AI_WS |
Chinese-Hong-Kong-Stroke-90, case-insensitive, accent-insensitive, kanatype-insensitive, width-sensitive |
Chinese_Hong_Kong_Stroke_90_CI_AI_KS |
Chinese-Hong-Kong-Stroke-90, case-insensitive, accent-insensitive, kanatype-sensitive, width-insensitive |
Chinese_Hong_Kong_Stroke_90_CI_AI_KS_WS |
Chinese-Hong-Kong-Stroke-90, case-insensitive, accent-insensitive, kanatype-sensitive, width-sensitive |
Chinese_PRC_CI_AI_KS_WS |
Chinese-PRC, case-insensitive, accent-insensitive, kanatype-sensitive, width-sensitive |
CHINESE_PRC_ 是代表中國大陸。如果是臺灣,則如:Chinese_TAIWAN_STROKE_CS_AS。
其它含義如下:
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和ACCESS默認是全角和半角有區分,最好要用WI,但單獨靠該選項,不能排除全角和半角,只有CI區分大小寫和WI區分寬度都選中,纔會正確區分全角和半角。
一般只要在設計數據庫時,用默認的即可,此時全角、半角和大小寫不區分。
區分大小寫:如果想讓比較將大寫字母和小寫字母視爲不等,請選擇該選項。
區分重音:如果想讓比較將重音和非重音字母視爲不等,請選擇該選項。如果選擇該選項,
比較還將重音不同的字母視爲不等。
區分假名:如果想讓比較將片假名和平假名日語音節視爲不等,請選擇該選項。
區分寬度:如果想讓比較將半角字符和全角字符視爲不等,請選擇該選項
二進制排序規則基於區域設置和數據類型所定義的編碼值的順序,對數據進行排序。SQL Server 中的二進制排序規則強制使用二進制排序順序,定義了要使用的語言區域設置和 ANSI 代碼頁。這裏的區域設置是指一組與地點和區域相關聯的信息。這個區域設置可以反映所採用的語言名稱、標識符、用於書寫該語言的文字以及文化習俗。排序規則可以與一個或多個區域設置相關聯。如果數據庫中只有單個語言,那麼這個區域設置對於排序規則的影響不是很大。對於非 Unicode 數據類型,數據比較將基於 ANSI 代碼頁中定義的碼位。對於 Unicode 數據類型,數據比較將基於 Unicode 碼位。對於 Unicode 數據類型的二進制排序規則,數據排序將不考慮區域設置。例如,對 Unicode 數據應用 Latin_1_General_BIN 和 Japanese_BIN,會得到完全相同的排序結果。
------修改列的排序規則
ALTER TABLE tb
ALTER COLUMNcolname nvarchar(100) COLLATE Chinese_PRC_CI_AS
------修改數據庫的排序規則
ALTER DATABASEdatabase COLLATEChinese_PRC_CS_AS
------查看某個表的排序規則
select collationfrom syscolumns whereid=object_id(N'yourtablename'
示例:
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
------------------------------------------------------------------
id | name |
1 | 中 |
2 | 國 |
3 | 人 |
4 | 阿 |
select * from #t order by name collate Chinese_PRC_CS_AS_KS_WS 同
select * from #t order by name
輸出結果相同,如下:
id | name |
4 | 阿 |
2 | 國 |
3 | 人 |
1 | 中 |
示例2:
create table #t1(id int,name varchar(20))
insert #t1 select 1,'三'
union all select 2,'乙'
union all select 3,'二'
union all select 4,'一'
union all select 5,'十'
select * from #t1
id | name |
1 | 三 |
2 | 乙 |
3 | 二 |
4 | 一 |
5 | 十 |
select * from #t1 order by name
id | name |
3 | 二 |
1 | 三 |
5 | 十 |
4 | 一 |
2 | 乙 |
按姓氏筆劃排序:
select * from #t1 order by name collate Chinese_PRC_Stroke_CS_AS_KS_WS
id | name |
4 | 一 |
2 | 乙 |
3 | 二 |
5 | 十 |
1 | 三 |
drop table #t
drop table #t1
常見問題處理:
“無法解決 equal to 操作的排序規則衝突。”
爲字段強制規定排序規則以避免不同字段排序規則不同帶來的衝突
詳情請參考:關於SQL SERVER 排序規則
id | name |
1 | 中 |
2 | 國 |
3 | 人 |
4 | 啊 |