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_AS
或Chinese_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中找到所有支持的排序规则的列表:
该字符U + 3422来自CJK统一表意文字表,这是unicode标准中相对模糊(且政治负载)的一部分.我的猜测是,SQL Server根本不知道那个部分 - 或者甚至故意不会因政治因素而实现它.
编辑:看起来我的猜测是错误的,真正的问题是拉丁语和日语排序规则都没有定义该字符的权重.