SQL Server 問題之 排序規則(collation)沖突


一、寫在前面

  最近公司進行開發環境升級,數據庫也准備了一個新的服務器,一切准備好后開始數據遷移,采取的方式為對現有Database(現有服務器Windows Server 2003 + SQL Server 2005)進行Back up,然后在新服務器(Windows Server 2008 R2 + SQL Server 2008 R2)上再Restore Databse,一切似乎挺順利的。但是當從Web Server開始訪問的時候出現錯誤Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.

 

二、問題分析

  上面出現的問題是由於排序規則沖突(collation)而引發,具體說來就是數據庫所使用的語言的排序規則沖突,查看數據庫所(老服務器)使用的排序規則如下所示

  而新服務器上數據庫的排序規則為SQL_Latin1_General_CP1_CI_AS(就不上圖了),由此可以看出排序規則不同,此即問題所在。

  那么為什么數據庫的排序規則會不同呢?換句話說數據庫的排序規則是怎么來的?原來這里的排序規則是在安裝SQL Server數據庫實例時配置/指定的,默認的排序規則將基於操作系統的區域語言設置,我們新服務器OS的區域語言為US - English,而在安裝SQL Server數據庫實例時我們又沒有配置排序規則(采取了默認的方式),所以才導致最終數據庫的排序規則為SQL_Latin1_General_CP1_CI_AS

 

三、解決問題

  下面列出解決此問題可能的方式以及說明

1. 在SQL語句中強行指定排序規則,類似的SQL語句如下所示 (COLLATE Chinese_PRC_CI_AI_WS)

SELECT A.ID, B.NO 
FROM TABLEA A INNER JOIN TABLEB B 
ON A.NAME=B.NAME COLLATE Chinese_PRC_CI_AI_WS

這種方式雖能解決問題,但是不建議采取,因為一旦需要更改的SQL語句很多,對開發者而言將是一種災難,而且不能從根本上解決問題

2. 更改字段、表、數據庫的排序規則

腳本更改數據庫的排序規則

ALTER DATABASE DBNAME COLLATE Chinese_PRC_CI_AS

雖然通過更改數據庫級別的排序規則能很大程度上解決大部分問題,但是一旦用到TempDB(確切地說使用到臨時表,例如Store Procedure中),排序規則問題將再次面臨,而且致命的是系統數據庫master貌似無法更改排序規則,至少筆者通過腳本運行的時候提示沒有權限運行,所以此種方式也沒有從根本上解決問題。

說明:重建數據庫也是不行的,只要master的排序規則沒變你就無法解決問題。

3. 承接上面的第二點,既然無法通過腳本更改master數據庫的排序規則,那么就重建master數據庫

執行類似下面的腳本

setup.exe /q /ACTION=RebuildDatabase /INSTANCENAME=MSSQLSERVER /SAPWD="sa-pwd" /SQLSYSADMINACCOUNTS="BUILTIN\ADMINISTRATORS" /SqlCollation=Chinese_PRC_CI_AS

或參考MSDN的文章http://support.microsoft.com/kb/298568/zh-cn

筆者沒有驗證此種方式是否有效(筆者采用上面的腳本運行,但是沒成功)

4. 卸載/重裝SQL Server實例

首先更改操作系統的區域語言為CN - Chinese,然后卸載並重裝SQL Server,之所以更改系統的區域語言設置,是為了在安裝SQL Server的時候可以采用默認的排序規則(當然你也可以不更改區域語言設置,但在安裝SQL Server的時候手工配置/指定排序規則為Chinese_PRC_CI_AS,排序規則設置界面時,系統默認選擇的是以下拉框的形式選擇排序規則的選項),此種方法徹底解決問題,推薦使用。

四、寫在最后

  以后再做數據庫遷移的時候,首先應該增加檢查現有數據庫的排序規則,然后在新服務器上安裝數據庫時,應確保和原有數據庫的排序規則一致。引申一下:其實不僅排序規則如此,其它有可能引起沖突或不兼容的都應該相應地做個檢查,做到升級或遷移之前解決問題,而不是把問題留到新服務器上,因為一旦時間緊迫,將是個災難,尤其是正式庫的升級。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM