一、写在前面

  最近公司进行开发环境升级,数据库也准备了一个新的服务器,一切准备好后开始数据迁移,采取的方式为对现有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,到“排序规则设置”界面时,系统默认选择的是以下拉框的形式选择排序规则的选项),此种方法彻底解决问题,推荐使用。

四、写在最后

  以后再做数据库迁移的时候,首先应该增加检查现有数据库的排序规则,然后在新服务器上安装数据库时,应确保和原有数据库的排序规则一致。引申一下:其实不仅排序规则如此,其它有可能引起冲突或不兼容的都应该相应地做个检查,做到升级或迁移之前解决问题,而不是把问题留到新服务器上,因为一旦时间紧迫,将是个灾难,尤其是正式库的升级。

SQL Server 问题之 排序规则(collation)冲突的更多相关文章

  1. 更改SQL Server 数据库的排序规则

    更改数据库的排序规则,SQL提示 5030 的错误,错误信息如下: The database could not be exclusively locked to perform the operat ...

  2. 数据库排序规则的冲突(理解collate Chinese_PRC_CI_AS)

    之前碰到了数据库排序规则冲突问题,即百度或者 Google 的老话题: “ 无法解决 equal to 操作中‘ sql_latin1_general_cp1_ci_as ’和‘ chinese_pr ...

  3. Sql Server系列:排序函数

    在SQL Server中有4个排序函数:ROW_NUMBER().RANK().DENSE_RANK()及NTILE()函数. 1. ROW_NUMBER()函数 ROW_NUMBER()函数为每条记 ...

  4. SQL Server排名或排序的函数

    SQL Server获得排名或排序的函数有如下几种: 1.Rank():在结果集中每一条记录所在的排名位置,但排名可能不连续,例如:若同一组内有两个第一名,则该组内下一个名次直接跳至第三名   sel ...

  5. SQL Server - 四种排序, ROW_NUMBER() /RANK() /DENSE_RANK() /ntile() over()

    >>>>英文版 (更简洁易懂)<<<< 转载自:https://dzone.com/articles/difference-between-rownum ...

  6. 解决SQL Server的cannot resolve the collation conflict问题

    当没有牵涉到两个不同的数据库时,出现以上错误.   Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" ...

  7. SQL server中自定义排序

    select * from OrderPolicyDetail order by ( case Project when 'C' then 1, when 'A' then 2, when 'D' t ...

  8. 设置与使用SQL Server的字符集(Collation,即排序规则)

    目录 目录 正确认识SQL Server的字符集 选择合适的SQL Server字符集 错误使用SQL Server的字符集 参考资料 正确认识SQL Server的字符集 SQL Server作为一 ...

  9. [转]SQL SERVER 的排序规则

    如何更改SQL SERVER 2000的排序规则 -- 增加复合主键语句 Alter Table tableName Add primary key (field1,field2) Alter dat ...

随机推荐

  1. bing 搜索引擎 无法访问 bug

    bing 搜索引擎 无法访问 bug 自从 Google 不好正常使用以后, 一直在使用 bing, 今天突然就 无法访问了,怎么回事?被黑了? ... loading https://cn.bing ...

  2. .net webapi创建接口

    最近使用webapi做了一个用户数据库接口,方便其它网站接入验证用户,实现中解决出现的一些问题,做了一些记录, 1.返回显示为json数据 2.允许其他网站访问,刚开始没有设,在本地机测试时可以访问, ...

  3. 对\${ctx}的一点理解

    一.\${ctx}与${pageContext.request.contextPath}的区别 相同点: \${ctx}和\${pageContext.request.contextPath}都是获取 ...

  4. tomcat设置虚拟路径映射服务器指定的物理路径

    在tomcat的server.xml中的host标签中加入如下标签: <Context crossContext="false" debug="1" do ...

  5. jenkins自动部署windwos服务器

    jenkins 持续构建windows 项目 需求说明 公司新购windwos服务器,并配置了堡垒机,由于经常要提交代码进行更新,导致手动部署很是麻烦,故采用公司jenkins实行持续构建 jenki ...

  6. VRRP主备备份配置示例—实现网关冗余备份

    本示例的基本拓扑结构如图所示. HostA通过Switch 双线连接到RouterA 和RouterB .用户希望实现:正常情况下, 主机以RouterA 为默认网关接入Intemet; 而当Rout ...

  7. 【BZOJ2961】共点圆(CDQ分治)

    [BZOJ2961]共点圆(CDQ分治) 题面 BZOJ 题解 设询问点\((x,y)\),圆心是\((X,Y)\) 那么如果点在园内的话就需要满足 \((X-x)^2+(Y-y)^2\le X^2+ ...

  8. 命令行Scp的使用----远程拷贝文件

    1.用CRT分别连上两台需要传输文件的linux系统服务器,并检查防火墙是否关闭. 查看防火墙状态: /etc/init.d/iptables status 若防火墙启用,暂时关闭防火墙: /etc/ ...

  9. 正确理解 LEAL (Load Effective Address) 指令

    LEAL: leal S, D    ->    D ← &S 在 CSAPP (Computer Systems: A Programmer’s Perspective) 中,对 LE ...

  10. [POI2011]ROT-Tree Rotations

    发现x的子树在后续处理中不会影响逆序对的情况(只关心有哪些值,相对位置已经不重要了) f[x]表示x为根的子树最小逆序对数 考虑左右儿子交换与否. 暴力是O(n^2)的 考虑线段树合并 左右儿子线段树 ...