初遇這個(gè)名詞,小D內(nèi)心真的是迷茫的,排序規(guī)則單純是升序降序這個(gè)意思嗎?其實(shí),這和Oracle里面的字符集
含義是相同的。
SQL Server支持多語(yǔ)言環(huán)境,在SQL Server中,字符集被稱為排序規(guī)則(Collation)。排序規(guī)則不僅影響記錄行的sort順序,還影響中文顯示是否亂碼等。在SQL Server中,排序規(guī)則可在服務(wù)器級(jí)別、數(shù)據(jù)庫(kù)級(jí)別以及表列級(jí)別設(shè)置。
在SQL Server軟件安裝時(shí)我們可設(shè)置服務(wù)器級(jí)別的排序規(guī)則,若在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)我們未指定排序規(guī)則,數(shù)據(jù)庫(kù)則會(huì)繼承實(shí)例的排序規(guī)則,而表中的列默認(rèn)是繼承數(shù)據(jù)庫(kù)的排序規(guī)則(除非在創(chuàng)建表時(shí)指定列的排序規(guī)則)。
通過以下命令分別查看不同級(jí)別下的排序規(guī)則:
數(shù)據(jù)庫(kù)級(jí)別:SELECT SERVERPROPERTY(N'Collation')
數(shù)據(jù)庫(kù)級(jí)別:SELECT name, collation_name FROM sys.databases WHERE name = N'mydb';
表列級(jí)別:SELECT name, collation_name FROM sys.columns
由于SQL Server的排序規(guī)則只影響字符型的列,如char, varchar, text, nchar, nvarchar, ntext,因此視圖sys.columns中非字符型的排序規(guī)則顯示為NULL。
小D筆記:
在安裝SQL Server時(shí),你可能困惑應(yīng)該選擇哪種字符集,官方是這么說(shuō)的
推薦使用SQL Server的字符集,而非Windows的字符集。原因在于SQL Server字符集是基于Windows衍生出來(lái)的,同時(shí)保證了SQL Server版本間的兼容性。
綜上述,我們應(yīng)盡可能的正確設(shè)置SQL Server排序規(guī)則:
- 1 正確的設(shè)置SQL Server排序規(guī)則 ,推薦使用Chinese_PRC_CI_AS排序規(guī)則。
- 2 盡可能多使用nvarchar等Unicode類型,而非varchar類型。
由此只需保持SQL Server中服務(wù)器、數(shù)據(jù)庫(kù)、表列三個(gè)級(jí)別的排序規(guī)則設(shè)置一致即是正確的使用方式。
科普貼
排序規(guī)則名稱由兩部份構(gòu)成,前半部份是指本排序規(guī)則所支持的字符集。
如:
Chinese_PRC_CI_AI_WS
前半部份:指UNICODE字符集,Chinese_PRC_指針對(duì)大陸簡(jiǎn)體字UNICODE的排序規(guī)則,按拼音排序;Chinese_PRC_Stroke 表示按漢字筆畫排序。
排序規(guī)則的后半部份即后綴。常用含義有:
- _BIN 二進(jìn)制排序
- _CI(CS) 是否區(qū)分大小寫,CI不區(qū)分,CS區(qū)分(case-insensitive/case-sensitive)
- _AI(AS) 是否區(qū)分重音,AI不區(qū)分,AS區(qū)分(accent-insensitive/accent-sensitive)
- _WI(WS) 是否區(qū)分寬度,WI不區(qū)分,WS區(qū)分(width-insensitive/width-sensitive)