zoukankan      html  css  js  c++  java
  • 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="BUILTINADMINISTRATORS" /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,排序规则设置界面时,系统默认选择的是以下拉框的形式选择排序规则的选项),此种方法彻底解决问题,推荐使用。

    四、写在最后

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

  • 相关阅读:
    古谚、评论与论断、名篇与名言
    重读《西游记》
    重读《西游记》
    命名之法 —— 时间、季节、地点
    命名之法 —— 时间、季节、地点
    文言的理解 —— 古时的称谓、别称、别名
    文言的理解 —— 古时的称谓、别称、别名
    Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration
    瀑布 敏捷 文档
    POJ 1325 ZOJ 1364 最小覆盖点集
  • 原文地址:https://www.cnblogs.com/panchunting/p/SQLServer_Issue_Collation.html
Copyright © 2011-2022 走看看