SQL Server 问题之 排序规则(collation)冲突
一、写在前面
最近公司进行开发环境升级,数据库也准备了一个新的服务器,一切准备好后开始数据迁移,采取的方式为对现有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)冲突的更多相关文章
- 更改SQL Server 数据库的排序规则
更改数据库的排序规则,SQL提示 5030 的错误,错误信息如下: The database could not be exclusively locked to perform the operat ...
- 数据库排序规则的冲突(理解collate Chinese_PRC_CI_AS)
之前碰到了数据库排序规则冲突问题,即百度或者 Google 的老话题: “ 无法解决 equal to 操作中‘ sql_latin1_general_cp1_ci_as ’和‘ chinese_pr ...
- Sql Server系列:排序函数
在SQL Server中有4个排序函数:ROW_NUMBER().RANK().DENSE_RANK()及NTILE()函数. 1. ROW_NUMBER()函数 ROW_NUMBER()函数为每条记 ...
- SQL Server排名或排序的函数
SQL Server获得排名或排序的函数有如下几种: 1.Rank():在结果集中每一条记录所在的排名位置,但排名可能不连续,例如:若同一组内有两个第一名,则该组内下一个名次直接跳至第三名 sel ...
- SQL Server - 四种排序, ROW_NUMBER() /RANK() /DENSE_RANK() /ntile() over()
>>>>英文版 (更简洁易懂)<<<< 转载自:https://dzone.com/articles/difference-between-rownum ...
- 解决SQL Server的cannot resolve the collation conflict问题
当没有牵涉到两个不同的数据库时,出现以上错误. Cannot resolve the collation conflict between "Chinese_PRC_CI_AS" ...
- SQL server中自定义排序
select * from OrderPolicyDetail order by ( case Project when 'C' then 1, when 'A' then 2, when 'D' t ...
- 设置与使用SQL Server的字符集(Collation,即排序规则)
目录 目录 正确认识SQL Server的字符集 选择合适的SQL Server字符集 错误使用SQL Server的字符集 参考资料 正确认识SQL Server的字符集 SQL Server作为一 ...
- [转]SQL SERVER 的排序规则
如何更改SQL SERVER 2000的排序规则 -- 增加复合主键语句 Alter Table tableName Add primary key (field1,field2) Alter dat ...
随机推荐
- Memcache介绍与应用场景
一:概念介绍 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果 ...
- No module named 'MySQLdb' python3.6 + django 1.10 + mysql 无法连接
学习python 连接mysql数据库的时候遇到了问题 首先安装mysql: 工具栏 ===>file ==> default settings==>Project Interpre ...
- 利用Eric+Qt Designer编写倒计时时钟
[前言]前几日通过编写命令行通讯录,掌握了Python的基本语法结构,于是开始向更高水平冲击,利用Eric与Qt Designer 编写一个带界面的小程序.本次实操中也确实遇到了不少问题,通过学习也都 ...
- oracle +plsql装完省略号不能点
1.如图 2.复制 TNS 服务名 3.复制到 登录框的 Database ,输入用户名密码,点OK..可以进去了,省略号变成可点击状态
- 【转】VMware虚拟机三种网络模式详解
由于Linux目前很热门,越来越多的人在学习Linux,但是买一台服务放家里来学习,实在是很浪费.那么如何解决这个问题?虚拟机软件是很好的选择,常用的虚拟机软件有VMware Workstations ...
- 【bzoj1187】 HNOI2007—神奇游乐园
http://www.lydsy.com/JudgeOnline/problem.php?id=1187 (题目链接) 题意 一个$n*m$的矩阵,其中每一个位置有一个权值,求一条回路使得经过的位置的 ...
- 第七周linux学习
<Linux内核分析> 一.可执行程序是怎么得来的? 编译器预处理(负责把include的文件包含进来及宏替换等工作):编译成汇编代码:编译器编译成目标代码:再链接成可执行文件:操作系统加 ...
- 遇到问题----java----myeclipse或者eclipse发布的项目时配置文件不更新或者无配置文件
myeclipse或者eclipse发布的项目时配置文件不更新或者无配置文件. 正常的web项目有目录 src/main/resources 和 src/main/java 这两个目录默认在编译发布时 ...
- JMH 使用指南 - java 性能测试
JMH 篇 JMH,即Java Microbenchmark Harness 翻译:java 微基准测试 工具套件.## 1.添加依赖```<dependency> <groupId ...
- bzoj3473: 字符串 && bzoj3277串
3473: 字符串 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 121 Solved: 53[Submit][Status][Discuss] D ...