为什么SQL Server认为N'㐢㐢㐢'和N'㐢㐢'相等?

Aid*_*yan 14 sql-server unicode

我们正在测试我们的Unicode兼容性应用程序,并且一直在选择拉丁字符集之外的随机字符进行测试.

在拉丁文和日文整理的系统中,以下相等是正确的(U + 3422):

N'????' = N'???'
Run Code Online (Sandbox Code Playgroud)

但以下不是(U + 30C1):

N'????' = N'???'
Run Code Online (Sandbox Code Playgroud)

当使用第一个示例(使用U + 3422)的测试用例违反唯一索引时,会发现这种情况.我们是否需要对我们用于测试的角色更具选择性?显然我们不知道上述比较的语义含义.这种行为对于母语人士来说是否明显?

Dir*_*mar 12

迈克尔卡普兰有一篇博客文章,他解释了如何比较Unicode字符串.这一切都归结为一个字符串需要有一个权重,如果不是,它将被视为等于空字符串.

对它进行排序:陪审团将给这个字符串无重量

在SQL Server中,此权重受定义的排序规则的影响.微软增加适当的排序规则CJK统一汉字在Windows XP/2003和SQL Server 2005这帖子推荐使用Chinese_Simplified_Pinyin_100_CI_ASChinese_Simplified_Stroke_Order_100_CI_AS:

您始终可以使用任何二进制和二进制2排序规则,但它不会为您提供语言正确的结果.对于SQL Server 2005,您应该使用支持代理对比较(但不是语言)的Chinese_PRC_90_CI_AS或Chinese_PRC_Stoke_90_CI_AS.对于SQL Server 2008,您应该使用Chinese_Simplified_Pinyin_100_CI_AS和Chinese_Simplified_Stroke_Order_100_CI_AS,它们具有更好的语言替代比较.我建议您使用这些排序规则作为服务器/数据库/表排序规则,而不是在比较期间传递排序规则名称.

因此,以下SQL语句将按预期工作:

select * from MyTable where N'' = N'?' COLLATE Chinese_Simplified_Stroke_Order_100_CI_AS;
Run Code Online (Sandbox Code Playgroud)

可以在MSDN中找到所有支持的排序规则的列表:

SQL Server 2008联机丛书:Windows排序规则名称


Mic*_*rdt 5

该字符U + 3422来自CJK统一表意文字表,这是unicode标准中相对模糊(且政治负载)的一部分.我的猜测是,SQL Server根本不知道那个部分 - 或者甚至故意不会因政治因素而实现它.

编辑:看起来我的猜测是错误的,真正的问题是拉丁语和日语排序规则都没有定义该字符的权重.

  • 什么,是"台独"的汉字?OMG,SQL Server是满洲数据库! (5认同)
  • @Dave:并不是那么糟糕,但是那些CJK统一表格试图系统地列出中国,台湾,日本和韩国使用的所有汉字,包括各种历史发展和正字改革.对于什么应该被视为单独的角色或仅仅是同一角色的变化存在分歧的无限可能性,并且鉴于区域历史,这很快就会变成政治论点. (2认同)