[========]
SQL Server 排序規則
影響
排序規則會作用到 order、where、group 語句中。
默認中文 Windows 系統中安裝的數據庫使用的排序規則為:Chinese_PRC_CI_AS
選項 | 描述 |
---|---|
區分大小寫 (_CS ) |
區分大寫字母和小寫字母。 如果選擇此項,排序時小寫字母將在其對應的大寫字母之前。 如果未選擇此選項,排序規則將不區分大小寫。 即 SQL Server 在排序時將大寫字母和小寫字母視為相同。 通過指定 _CI ,可以顯式選擇不區分大小寫。 |
區分重音 (_AS ) |
區分重音字符和非重音字符。 例如,“a”和“ấ”視為不同字符。 如果未選擇此選項,則排序規則將不區分重音。 即 SQL Server 在排序時將字母的重音形式和非重音形式視為相同。 通過指定 _AI ,可以顯式選擇不區分重音。 |
區分全半角 (_WS ) |
區分全角字符和半角字符。 如果未選擇此選項,SQL Server 會在排序時將同一字符的全角和半角形式視為相同。 省略此選項是指定不區分全半角的唯一方法。 |
參考:
排序規則和 Unicode 支持
深入SQL Server 排序規則的原理
效果演示
表結構如下:
排序規則:
- name Chinese_PRC_CS_AS_WS 大小寫 重音 全半角
- sss Chinese_PRC_CI_AI_WS 全半角
數據:
id,name,sss
1,123aaa啊,啊
2,123aaa啊(),啊aaa()
3,123aaa啊(),啊aaa()
4,123AAA啊(),啊AAA()
查詢語句:
select * from dbo.Table_1
where name = '123aaa啊()'
select * from dbo.Table_1
where sss = '啊aaa()'
輸出結果:
- 檢查大小寫、全半角,最后匹配到一條結果
- 檢查全半角、不檢查大小寫,最后匹配到兩條結果
更改數據庫排序規則
排序規則級別:
- 服務器級排序規則
- 數據庫級排序規則
- 列級排序規則
- 表達式級排序規則
服務器級排序規則
默認服務器排序規則是在 SQL Server 安裝過程中設置的,由操作系統 (OS) 區域設置確定的默認排序規則。它將成為系統數據庫和所有用戶數據庫的默認排序規則。
數據庫級排序規則
創建或修改數據庫時,可使用 CREATE DATABASE 或 ALTER DATABASE 語句的 COLLATE 子句指定默認數據庫排序規則。 如果未指定排序規則,將為該數據庫分配服務器排序規則。
除非更改服務器的排序規則,否則無法更改系統數據庫的排序規則。
可以修改數據庫的排序規則:
ALTER DATABASE myDB COLLATE Chinese_PRC_CS_AS_WS;
重要:更改數據庫級排序規則不會影響現有列級排序規則或表達式級排序規則。
列級排序規則
當創建或更改表時,可使用 COLLATE
子句指定每個字符串列的排序規則。 如果不指定排序規則,將為列分配數據庫的默認排序規則。
可使用如下的 ALTER TABLE
語句更改列的排序規則:
ALTER TABLE myTable ALTER COLUMN mycol NVARCHAR(10) COLLATE Chinese_PRC_CS_AS_WS;
查詢時指定規則
查詢條件后加 COLLATE
語句,比如上面的第二個查詢,這樣只會查到一條結果。
select * from dbo.Table_1
where sss = '啊aaa()' collate Chinese_PRC_CS_AS_WS
建議
使用 Unicode 數據類型
請使用 Unicode 數據類型(nchar 、nvarchar 和 ntext ),而不是非 Unicode 數據類型(char 、varchar 和 text )。
Unicode 是一種將碼位映射到字符的標准。由於它旨在涵蓋全球所有語言的所有字符,因此無需使用不同代碼頁來處理不同字符集。支持國際化客戶端的數據庫應始終使用 Unicode 數據類型,而不應使用非 Unicode 數據類型。
備注
對於 Unicode 數據類型,數據庫引擎最多可以使用 UCS-2 表示 65,535 個字符;或者,如果使用了附屬字符,則可表示整個 Unicode 范圍(1,114,111 個字符)。 如需詳細了解如何啟用增補字符,請參閱 補充字符。
使用二進制排序規則
二進制排序規則區分大小寫。
對於非 Unicode
數據類型,數據比較將基於 ANSI 代碼頁中定義的碼位。
對於Unicode
數據類型,數據比較將基於 Unicode 碼位,不考慮區域設置。由於 Unicode 碼位的比較相對簡單,因此二進制排序規則有助於提高應用程序性能。
SQL Server 中有兩種類型的二進制排序規則:
- 在 BIN 排序規則中,僅首字符按照碼位排序,其余字符根據其字節值排序。
- 更新的 BIN2 排序規則中,所有字符根據其碼位排序。