我只是不明白。请参阅此 SQL 查询:
select nchar(65217) -- ﻁ
select nchar(65218) -- ﻂ
select nchar(65219) -- ﻃ
select nchar(65220) -- ﻄ
if nchar(65217) = nchar(65218)
print 'equal'
if nchar(65217) = nchar(65219)
print 'equal'
if nchar(65217) = nchar(65220)
print 'equal'
基于传递关系,这意味着 SQL Server 认为它们都是同一个字符。
但是,在其他环境中,例如 C#,它们并不相同。
我感到困惑的是:
- 字符串比较在 SQL Server 中的工作原理
- 为什么比较在一台机器和一个平台上的行为不同,但在不同的环境下
- 这 4 个字符代表一个人类可以理解的字符。为什么它们在 Unicode 字符映射中如此丰富?
这当然会导致巨大的问题,因为我正在开发一个文本处理应用程序,数据几乎来自任何地方,我需要在处理之前对文本进行规范化。
如果我知道差异的原因,我可能会找到处理它的解决方案。谢谢你。
SQL Server 中的所有字符数据都与一个排序规则相关联,该排序规则确定了可以存储的字符域以及用于比较和排序数据的规则。排序规则适用于 Unicode 和非 Unicode 数据。
SQL Server 包括 3 大类归类:二进制、旧版和 Windows。二进制类别(
_BIN
后缀)中的排序规则使用底层代码点进行比较,因此如果代码点不同而与字符无关,则相等比较返回不相等。旧版(SQL_
前缀)和 Windows 排序规则为更自然的字典规则提供排序和比较语义。这允许比较考虑大小写、重音符号、宽度和假名。Windows 排序规则提供了与 Windows 操作系统紧密对齐的更强大word-sort
的规则,而传统排序规则只考虑单个字符。下面的示例说明了 Windows 和带有 Teth 字符的二进制排序规则之间的区别:
http://en.wikipedia.org/wiki/Duplicate_characters_in_Unicode中概述了为什么 Unicode 可能包含相同字形的不同代码点的原因 。我总结一下,这可能是为了遗留兼容性,或者字符不是规范等效的。请注意,Teth 字符
ﻁ
用于不同的语言 ( http://en.wikipedia.org/wiki/Teth )。这与
COLLATION
您的数据库有关(更多信息在 BOL 中)。我不完全确定您遇到问题的特定字符的语言(我猜测基于此线程的波斯语),但如果您在相等运算符中指定正确的排序规则,那么您会得到准确的结果。