这是一个实际一个项目中遇到的问题BHL(上海)和BHL(上海)比较的结果是一样的导致引起的重复的主键问题
BHL(上海)和BHL(上海)差别就在于前者的括号是全角的括号字符后者是半角的括号字符全角的括号字符和半角的括号字符的ascii码显然是不一样的全角的( ASCII码是xAA 而半角的( 是x那么为什么SQL Server会认为是一样的呢?
问题其实就出在数据库的排序规则上让我们在仔细研读一下SQL Server的文档SQL Server的排序规则由这样几部分组成代码页区分大小写区分重音区分宽度最后一个在SQL Server的联机帮助中没有进一步提及其实本篇遇到的问题就是由于这个原因造成的区分宽度指定 SQL Server 区分相同字符的单字节表示法(半角)和双字节表示法(全角)如果没有选择则 SQL Server 将认为相同字符的单字节表示法和双字节表示法等效
缺省安装SQL Server中文版的时候SQL Server帮你选择的排序规则是Chinese_PRC_CI_AS(ChinesePRC caseinsensitive accentsensitive kanatypeinsensitive widthinsensitive)是中文不区分大小写区分重音不区分假名不区分宽度因此自然就认同BHL(上海)=BHL(上海)
所以正确的选择应该是后缀为WS的中文排序规则本例中我们应该选择Chinese_PRC_CI_AS_WS
我们来看一下指定排序规则是Chinese_PRC_CI_AS_WS后怎么样了?
select where BHL(上海)=BHL(上海)
collate Chinese_PRC_CI_AS_WS
(所影响的行数为 行)
看来这个问题解决了
重要提示
如何察看使用那个排序规则呢?可以使用下面的SQL语句
SELECT *
FROM ::fn_helpcollations()
可以查询所有排序规则的信息
查出所有中文排序规则的信息
SELECT * FROM
(
SELECT *
FROM ::fn_helpcollations()) A
WHERE name like Chinese%