SQL Server 问题之 排序规则(collation)冲突
一、寫在前面
最近公司進(jìn)行開發(fā)環(huán)境升級(jí),數(shù)據(jù)庫(kù)也準(zhǔn)備了一個(gè)新的服務(wù)器,一切準(zhǔn)備好后開始數(shù)據(jù)遷移,采取的方式為對(duì)現(xiàn)有Database(現(xiàn)有服務(wù)器Windows Server 2003 + SQL Server 2005)進(jìn)行Back up,然后在新服務(wù)器(Windows Server 2008 R2 + SQL Server 2008 R2)上再Restore Databse,一切似乎挺順利的。但是當(dāng)從Web Server開始訪問的時(shí)候出現(xiàn)錯(cuò)誤Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation.
?
二、問題分析
上面出現(xiàn)的問題是由于排序規(guī)則沖突(collation)而引發(fā),具體說來就是數(shù)據(jù)庫(kù)所使用的語(yǔ)言的排序規(guī)則沖突,查看數(shù)據(jù)庫(kù)所(老服務(wù)器)使用的排序規(guī)則如下所示
而新服務(wù)器上數(shù)據(jù)庫(kù)的排序規(guī)則為SQL_Latin1_General_CP1_CI_AS(就不上圖了),由此可以看出排序規(guī)則不同,此即問題所在。
那么為什么數(shù)據(jù)庫(kù)的排序規(guī)則會(huì)不同呢?換句話說數(shù)據(jù)庫(kù)的排序規(guī)則是怎么來的?原來這里的排序規(guī)則是在安裝SQL Server數(shù)據(jù)庫(kù)實(shí)例時(shí)配置/指定的,默認(rèn)的排序規(guī)則將基于操作系統(tǒng)的區(qū)域語(yǔ)言設(shè)置,我們新服務(wù)器OS的區(qū)域語(yǔ)言為US - English,而在安裝SQL Server數(shù)據(jù)庫(kù)實(shí)例時(shí)我們又沒有配置排序規(guī)則(采取了默認(rèn)的方式),所以才導(dǎo)致最終數(shù)據(jù)庫(kù)的排序規(guī)則為SQL_Latin1_General_CP1_CI_AS
?
三、解決問題
下面列出解決此問題可能的方式以及說明
1. 在SQL語(yǔ)句中強(qiáng)行指定排序規(guī)則,類似的SQL語(yǔ)句如下所示 (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這種方式雖能解決問題,但是不建議采取,因?yàn)橐坏┬枰牡腟QL語(yǔ)句很多,對(duì)開發(fā)者而言將是一種災(zāi)難,而且不能從根本上解決問題
2. 更改字段、表、數(shù)據(jù)庫(kù)的排序規(guī)則
腳本更改數(shù)據(jù)庫(kù)的排序規(guī)則
ALTER DATABASE DBNAME COLLATE Chinese_PRC_CI_AS雖然通過更改數(shù)據(jù)庫(kù)級(jí)別的排序規(guī)則能很大程度上解決大部分問題,但是一旦用到TempDB(確切地說使用到臨時(shí)表,例如Store Procedure中),排序規(guī)則問題將再次面臨,而且致命的是系統(tǒng)數(shù)據(jù)庫(kù)master貌似無法更改排序規(guī)則,至少筆者通過腳本運(yùn)行的時(shí)候提示沒有權(quán)限運(yùn)行,所以此種方式也沒有從根本上解決問題。
說明:重建數(shù)據(jù)庫(kù)也是不行的,只要master的排序規(guī)則沒變你就無法解決問題。
3. 承接上面的第二點(diǎn),既然無法通過腳本更改master數(shù)據(jù)庫(kù)的排序規(guī)則,那么就重建master數(shù)據(jù)庫(kù)
執(zhí)行類似下面的腳本
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
筆者沒有驗(yàn)證此種方式是否有效(筆者采用上面的腳本運(yùn)行,但是沒成功)
4. 卸載/重裝SQL Server實(shí)例
首先更改操作系統(tǒng)的區(qū)域語(yǔ)言為CN - Chinese,然后卸載并重裝SQL Server,之所以更改系統(tǒng)的區(qū)域語(yǔ)言設(shè)置,是為了在安裝SQL Server的時(shí)候可以采用默認(rèn)的排序規(guī)則(當(dāng)然你也可以不更改區(qū)域語(yǔ)言設(shè)置,但在安裝SQL Server的時(shí)候手工配置/指定排序規(guī)則為Chinese_PRC_CI_AS,到“排序規(guī)則設(shè)置”界面時(shí),系統(tǒng)默認(rèn)選擇的是以下拉框的形式選擇排序規(guī)則的選項(xiàng)),此種方法徹底解決問題,推薦使用。
四、寫在最后
以后再做數(shù)據(jù)庫(kù)遷移的時(shí)候,首先應(yīng)該增加檢查現(xiàn)有數(shù)據(jù)庫(kù)的排序規(guī)則,然后在新服務(wù)器上安裝數(shù)據(jù)庫(kù)時(shí),應(yīng)確保和原有數(shù)據(jù)庫(kù)的排序規(guī)則一致。引申一下:其實(shí)不僅排序規(guī)則如此,其它有可能引起沖突或不兼容的都應(yīng)該相應(yīng)地做個(gè)檢查,做到升級(jí)或遷移之前解決問題,而不是把問題留到新服務(wù)器上,因?yàn)橐坏r(shí)間緊迫,將是個(gè)災(zāi)難,尤其是正式庫(kù)的升級(jí)。
轉(zhuǎn)載自:http://www.cnblogs.com/panchunting/p/SQLServer_Issue_Collation.html
?
程序員的基礎(chǔ)教程:菜鳥程序員
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的SQL Server 问题之 排序规则(collation)冲突的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS判断是否是微信页面,判断手机操作系统
- 下一篇: JMeter 分布式性能测试