码迷,mamicode.com
首页 > 数据库 > 详细

SQL Server 问题之 排序规则(collation)冲突

时间:2015-11-28 19:47:37      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

一、写在前面

  最近公司进行开发环境升级,数据库也准备了一个新的服务器,一切准备好后开始数据迁移,采取的方式为对现有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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!