操作中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_CI_AI" 之间的排序规则冲突



 有个需求:要求数据库系统自动同步两个不同数据库中的人员信息。

首先想到写一个存储过程然后由系统任务来自动处理。

尝试性的写了下面的查询语句:

select WINDOWSID,NAME,EMAIL,DEPT,CONT from DB1.dbo.USER

 where WINDOWSID in (select WINDOWSID from DB2.dbo.USER)

发现SQL server2005报如下错误:

Msg 468, Level 16, State 9, Line 1

无法解决 equal to 操作中 "Chinese_PRC_CI_AS" "Chinese_PRC_CI_AI" 之间的排序规则冲突。


操作中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_CI_AI" 之间的排序规则冲突
 

在网上查了半天资料,如果你看这片文章之前也查了些资料,应该和我看到的差不多,结果就是弄清楚了什么是“Chinese_PRC_CI_AS和“Chinese_PRC_CI_AI”你还会得到如下语句:

alter database DB1 collate Chinese_PRC_CI_AS;

alter database DB2 collate Chinese_PRC_CI_AS;

但是执行这两条语句后,再作查询,错误依旧。

然后根据之前网上的信息,修改查询语句为:

select WINDOWSID,NAME,EMAIL,DEPT,CONT from DB1.dbo.USER

 where WINDOWSID in (select WINDOWSID collate Chinese_PRC_CI_AS from DB2.dbo.USER)

发现查询可以得到结果。

下面对上面的问题做个总结:

第一步,基础知识。查看SQLserver2005的帮助,你会得到如下信息:

CollationDesignator

Specifies the base collation rules used by the Windows collation. The base collation rules cover the following:

       The alphabet or language whose sorting rules are applied when dictionary sorting is specified

       The code page used to store non-Unicode character data.

Some examples are:

       Latin1_General or French: both use code page 1252.

       Turkish: uses code page 1254.

For a list of collation designators, see Collation Settings in Setup.

CaseSensitivity

CI specifies case-insensitive, CS specifies case-sensitive.

AccentSensitivity

AI specifies accent-insensitive, AS specifies accent-sensitive.

KanatypeSensitive

Omitted specifies kanatype-insensitive, KS specifies kanatype-sensitive.

WidthSensitivity

Omitted specifies width-insensitive, WS specifies width-sensitive.

BIN

Specifies the backward-compatible binary sort order is to be used.

BIN2

Specifies the binary sort order that uses code-point comparison semantics introduced in SQL Server 2005.

我们可以详细认识到Chinese_PRC_CI_AS的含义。

第二步,修改数据库的collate。前文已提到的SQL语句可以用来修改数据库的collate  ,当然你也可以通过SQL2005界面更便捷的修改。

 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_CI_AI" 之间的排序规则冲突

还有就是修改系统的全局collate

 

第三步:通过以上步骤可以说准备工作已经全部完成了。

既然数据库的collate都是Chinese_PRC_CI_AS为什么查询的时候还会报错?只有如下语句才能执行?

select WINDOWSID,NAME,EMAIL,DEPT,CONT from DB1.dbo.USER

 where WINDOWSID in (select WINDOWSID collate Chinese_PRC_CI_AS from DB2.dbo.USER)

只能有一种原因:嵌套查询语句的collate默认和设置的不一致,查看全局collate也是Chinese_PRC_CI_AS,那到底为什么还会报错呢?


操作中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_CI_AI" 之间的排序规则冲突
 

因为在windows系统中大小写是不敏感的,难道是这个原因?

经过一番折腾对collate有了一定的了解,也算些收获吧!

写的不好,见谅!