SQL Server 更改排序規則
最近因為測試環境 MSSQL 伺服器排序規則區分大小寫,導致實用到臨時表(tempdb)的資料、臨時物件都區分了大小寫。所以重建了系統資料庫並更改了排序規則,這裡再次總結一下。
開始之前,先確認排序規則(或大小寫是否敏感)
--檢視伺服器排序規則(安裝時指定的排序規則) SELECT SERVERPROPERTY('COLLATION') AS ServerCollation ,DATABASEPROPERTYEX('tempdb','COLLATION') AS TempdbCollation ,DATABASEPROPERTYEX(DB_NAME(),'COLLATION') AS CurrentDBCollation --檢視資料庫排序規則 SELECT name, collation_name FROM sys.databases --當前資料庫是否大小寫敏感 SELECT CASE WHEN N'A'=N'a' THEN N'不敏感' ELSE N'敏感' END
此環境例項中,伺服器排序規則為 Chinese_PRC_BIN ,當前資料庫排序規則為 Chinese_PRC_CI_AS。若當前資料庫建立的所有物件和執行指令碼時,如果用到了變數、臨時物件等,大小寫不一致則出現問題。二進位制(_BIN)排序規則是區分大小寫的,參考 Windows Collation Sorting Styles。
安裝例項時指定的排序規則,就是 master 資料庫的排序規則,同時 model 和 msdb 的排序規則也保持一致,而 tempdb 和使用者資料庫的排序規則都是參照 model 資料庫一樣的。系統資料庫是不能直接更改排序規則的,因此只能重建系統資料庫,且讓系統資料庫的排序規則都一致。
重建例項排序規則和系統資料庫排序規則:
1. 備份系統資料庫!必要的,失敗了或者以後要使用當前環境時,還可以回退!
2. 記住所有資料庫及檔案路徑,保持到 excel 中。如果記得住所有資料庫位置的話就不用了。
select DB_NAME(database_id) as name,physical_name from sys.master_files
3. 匯出伺服器配置(sp_configure)到 excel。因為重建系統資料庫後配置會被初始化。
4. 匯出賬號資訊到 txt。資料庫重建,賬戶資訊都會丟失,除了備份也要單獨備份賬號。(SQL Server 中登入賬號與資料庫使用者遷移
5. 匯出連結伺服器生產指令碼到 txt ,如果有的話。
6. 匯出代理作業到 txt 。
7. (如果還有其他配置,如稽核、郵件配置、策略等,都儲存出來,後續再重建)
8. 分離所有使用者資料庫。
select 'ALTER DATABASE ['+name+'] SET SINGLE_USER WITH ROLLBACK IMMEDIATE'+char(10)+'go'+char(10)
+'EXEC master.dbo.sp_detach_db @dbname = N'''+name+''''+char(10)+'go'+char(10)
from sys.databases where name not in('master','model','msdb','tempdb')
9. 停止所有資料庫相關服務。
10. 重建資料庫並制定新的排序規則。開啟命令列,進入安裝目錄。
cd D:\Software\en_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_520517
setup /QUIET /ACTION=REBUILDDATABASE /instancename=mssqlserver /SQLSYSADMINACCOUNTS=伺服器賬號 /sapwd=密碼 /sqlcollation=Chinese_PRC_CI_AS
11. 啟動 SQL Server 引擎服務,其他暫不啟動。
12. 建立登入賬戶(之前匯出的指令碼)
13. 附加所有使用者資料庫。
14. 建立代理作業、連結伺服器、更配置等!
完成!~
如果重建系統資料庫後,還原 master 資料庫,那麼伺服器排序規則和 master 資料庫排序規則都還原和以前一樣,所以不能還原,除非恢復到以前的環境。
如果還原 msdb 或 model ,該資料庫排序規則也會還原,所以系統資料庫備份都不要還原,重建系統資料庫之後只能重新配置。
更改使用者資料庫排序規則:
ALTER DATABASE test COLLATE Chinese_PRC_CI_AS
更改資料庫排序規則時,需要更改下列內容:
>> 將系統表中的任何 char、varchar、text、nchar、nvarchar 或 ntext 列更改為使用新的排序規則。
>> 將儲存過程和使用者定義函式的所有現有 char、varchar、text、nchar、nvarchar 或 ntext 引數和標量返回值更改為使用新的排序規則。
>> 將 char、varchar、text、nchar、nvarchar 或 ntext 系統資料型別和基於這些系統資料型別的所有使用者定義的資料型別更改為使用新的預設排序規則。
對於資料庫內欄位定義的排序規則,參考下面的 設定或更改列排序規則。
設定或更改列排序規則:
--示例
CREATE TABLE dbo.MyTable(
PrimaryKey INT PRIMARY KEY,
CharCol VARCHAR(10) COLLATE French_CI_AS NOT NULL
);
GO
ALTER TABLE dbo.MyTable ALTER COLUMN CharCol VARCHAR(10) COLLATE Latin1_General_CI_AS NOT NULL;
GO
如果下列其中之一當前正在引用一個列,則無法更改該列的排序規則:
>> 計算列
>> 索引
>> 自動生成或由 CREATE STATISTICS 語句生成的分發統計資訊
>> CHECK 約束
>> FOREIGN KEY 約束
參考: