标签:
一、写在前面
最近公司进行开发环境升级,数据库也准备了一个新的服务器,一切准备好后开始数据迁移,采取的方式为对现有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,到“排序规则设置”界面时,系统默认选择的是以下拉框的形式选择排序规则的选项),此种方法彻底解决问题,推荐使用。
以后再做数据库迁移的时候,首先应该增加检查现有数据库的排序规则,然后在新服务器上安装数据库时,应确保和原有数据库的排序规则一致。引申一下:其实不仅排序规则如此,其它有可能引起冲突或不兼容的都应该相应地做个检查,做到升级或迁移之前解决问题,而不是把问题留到新服务器上,因为一旦时间紧迫,将是个灾难,尤其是正式库的升级。
转载自:http://www.cnblogs.com/panchunting/p/SQLServer_Issue_Collation.html
SQL Server 问题之 排序规则(collation)冲突
标签:
原文地址:http://www.cnblogs.com/guohu/p/5003084.html