正確認識SQL Server的字符集
SQL Server 作為一個國際化產品,支持多語言環境。在 SQL Server 中,字符集被稱為排序規則(即Collation)。排序規則不僅影響記錄行的 sort 順序,還影響中文顯示是否亂碼等。在 SQL Server 中,排序規則可在 3 處地方設置:
- 服務器級別 =>instances
- db庫級別 =>databases
- 表列級別 =>columns
下圖所示為 SQL Server 默認情況下對 Collation 繼承的方式。
即在 SQL Server 軟件安裝時我們可設置服務器級別的排序規則,也就是 instances 的排序規則。如下所示是使用 T-SQL 查詢當前 instances 的排序規則信息:
--查詢當前SQL Server服務器的排序規則
SELECT SERVERPROPERTY(N'Collation')
(no column name)
--------------------------------------------------
Chinese_PRC_CI_AS
默認排序規則是 Chinese_PRC_CI_AS
當然你也可以使用 SSMS 查看服務器屬性:
若在創建 Databases 時我們未指定排序規則,Databases 則會使用 Instances 的排序規則。如下所示是通過 sql 代碼查詢 SQL Server 中 Databases 的排序規則信息:
--通過目錄視圖 sys.databases 查詢 Databases 的排序規則
SELECT name,collation_name FROM sys.databases WHERE name = N'STUDR'; //將STUDY替換為數據庫名
name collation_name
-------------------------------------------------
STUDY Chinese_PRC_CI_AS
當然你也可以使用 SSMS 通過查看數據庫屬性得知數據庫的字符集。
而表中的列(columns)默認情況是繼承 Databases 的排序規則(除非在創建表時對列的排序規則進行指定),我們可通過目錄視圖 sys.columns 查詢表中 columns 的排序規則信息。
--注意:只有字符型的列才會顯示排序規則信息,非字符型的顯示為NULL
SELECT name, collation_name FROM sys.columns where collation_name is NOT NULL
注意:SQL Server 的排序規則只影響字符型的列,如 char, varchar, text, nchar, nvarchar, ntext,因此目錄視圖 sys.columns 中非字符型的排序規則顯示為 NULL 。
選擇合適的SQL Server字符集
在安裝SQL Server時,你可能困惑應該選擇哪種字符集,SQL Server或者Windows的。官方推薦使用SQL Server的字符集,而非Windows的字符集。原因是,SQL Server字符集是基於Windows衍生出來的,同時保證SQL Server版本間的兼容性。
可通過如下命令查看當前SQL Server支持的排序規則:
SELECT * from ::fn_helpcollations()
注意字符集的名字縮寫與對應的的描述,如 CI 表示不區分大小寫。
錯誤使用SQL Server的字符集
我們不難理解:只需保持 SQL Server 中 3 處字符集設置的地方:Instances、Databases、Columns 設置一致即是正確的使用方式。
那么當 SQL Server 中 Instances 與 Databases 對排序規則設置不一致時,將直接導致臨時表#或##不能正常使用(臨時表的列默認繼承 tempdb 的排序規則,而 tempdb 則繼承了 Instances 的排序規則)。
所以,我們應盡可能的正確設置 SQL Server 排序規則:
- 正確的設置 SQL Server 排序規則 ,保持 Instances、Databases、Columns 中 3 處排序規則一致,默認字符集是 Chinese_PRC_CI_AS 。
- 盡可能使用 nvarchar 等 Unicode 類型,而非 varchar 類型 。
修改字符集
安裝 SQL Server 時,默認字符集是 Chinese_PRC_CI_AS ,如果安裝完成后,我們想更改字符集,應該怎樣操作呢?
注:再安裝 SQL Server 時,可配置字符集。
修改數據庫字符集
本例演示將數據庫 STUDY 字符集從 Chinese_PRC_CI_AS 修改成 Latin1_General_100_CS_AS_SC。
修改方法一:
查看數據庫屬性,然后按照下圖步驟進行修改:
注意:需要斷開其他鏈接,否則會報錯如下:
修改方法二:
在查詢分析器中,輸入如下命令:
ALTER DATABASE [STUDY] COLLATE Chinese_PRC_CI_AS
命令執行成功后,通過 sql 代碼查詢 SQL Server 中 Databases 的排序規則信息:
--通過目錄視圖 sys.databases 查詢 Databases 的排序規則
SELECT name,collation_name FROM sys.databases WHERE name = N'STUDR'; //將STUDY替換為數據庫名
name collation_name
-------------------------------------------------
STUDY Latin1_General_100_CS_AS_SC
修改成功!
修改服務器字符集
本例演示將服務器字符集從 Chinese_PRC_CI_AS 修改成 Latin1_General_100_CS_AS_SC。
服務器字符集的修改稍微復雜些
1)查看數據庫安裝路徑
補充:(Windows Service) 各版本的默認安裝路徑
1 SQL Server 2008 C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Release
2 SQL Server 2012 C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\SQLServer2012
3 SQL Server 2014 C:\Program Files\Microsoft SQL Server\120\Setup Bootstrap\SQLServer2014
4 SQL Server 2016 C:\Program Files\Microsoft SQL Server\140\Setup Bootstrap\SQLServer2016
本例使用的是SQL Server 2012,默認安裝路徑為 C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\SQLServer2012
2)使用管理員權限打開DOS命令行
3)切換進數據庫安裝文件目錄
cd C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\SQLServer2012
4)關閉SQL Server 后台服務
方式1:使用 Net stop 語句關閉 SQL Server 后台服務
Net stop STUDY
方式2:通過 Sql Server Configuration Manager 關閉 SQL Server 后台服務
5)運行語句修改字符集
Setup /QUIET /ACTION=REBUILDDATABASE /instancename=STUDY /SQLSYSADMINACCOUNTS=administrator /sapwd=123456 /sqlcollation=Latin1_General_100_CS_AS_SC
格式說明:
Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=InstanceName
/SQLSYSADMINACCOUNTS=accounts / [ SAPWD= StrongPassword ]
/SQLCOLLATION=CollationName)
注意: accounts 用戶使用電腦管理員用戶,CollationName 為需要變更的排序格式 。
6)待5)中命令執行完成后,執行如下命令檢查服務器字符集是否修改成功
--查詢當前SQL Server服務器的排序規則
SELECT SERVERPROPERTY(N'Collation')
(no column name)
--------------------------------------------------
Latin1_General_100_CS_AS_SC
修改成功!
參考文章:https://blog.csdn.net/wstoneh01/article/details/50588720