操作中 "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”你还会得到如下语句:
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界面更便捷的修改。
还有就是修改系统的全局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,那到底为什么还会报错呢?
因为在windows系统中大小写是不敏感的,难道是这个原因?
经过一番折腾对collate有了一定的了解,也算些收获吧!
写的不好,见谅!