一、写在前面
最近公司进行开发环境升级,数据库也准备了一个新的服务器,一切准备好后开始数据迁移,采取的方式为对现有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,COLLATE语句跟在要查的column之后)
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,到“排序规则设置”界面时,系统默认选择的是以下拉框的形式选择排序规则的选项),此种方法彻底解决问题,推荐使用。
四、写在最后
以后再做数据库迁移的时候,首先应该增加检查现有数据库的排序规则,然后在新服务器上安装数据库时,应确保和原有数据库的排序规则一致。引申一下:其实不仅排序规则如此,其它有可能引起冲突或不兼容的都应该相应地做个检查,做到升级或迁移之前解决问题,而不是把问题留到新服务器上,因为一旦时间紧迫,将是个灾难,尤其是正式库的升级。
编辑推荐:
- 【Case】cannot resolve the collation conflict between "xxx" and "xxx"03-02
- Sqlserver 2014 alwayson架构主节点执行alter table导致从节点的阻塞问题03-02
- 出现操作系统错误 1330(此帐户的密码已过期。)03-02
- SQL Server Report Service网页页面显示英文问题03-02
- 通过链接服务器把一台服务器的数据insert到另一台服务器上03-02
- sqlserver 查询用户角色脚本03-02
- 【SQLServer】SQLServer使数据库脱机offline03-02
- 信息中心机房,空气调节系统的设计03-02
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 【Case】cannot resolve the collation conflict between "xxx" and "xxx"
- 出现操作系统错误 1330(此帐户的密码已过期。)
出现操作系统错误 1330(此帐户的密码已过期。)
26-03-02 - SQL Server Report Service网页页面显示英文问题
SQL Server Report Service网页页面显示英文问题
26-03-02 - 通过链接服务器把一台服务器的数据insert到另一台服务器上
通过链接服务器把一台服务器的数据insert到另一台服务器上
26-03-02 - 【SQLServer】SQLServer使数据库脱机offline
【SQLServer】SQLServer使数据库脱机offline
26-03-02 - 信息中心机房,空气调节系统的设计
信息中心机房,空气调节系统的设计
26-03-02 - sqlserver 无法启动,报错误 26024,严重性 16,状态 1
sqlserver 无法启动,报错误 26024,严重性 16,状态 1
26-03-02 - 把txt文本导入sqlserver表内
把txt文本导入sqlserver表内
26-03-02 - Ubuntu部署测试全流程指南(手把手教你完成Ubuntu系统验证)
Ubuntu部署测试全流程指南(手把手教你完成Ubuntu系统验证)
26-03-02 - Sqlserver delete表部分数据释放数据文件空间
Sqlserver delete表部分数据释放数据文件空间
26-03-02
