我只是不明白.看到这个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'
基于transitive relation,这意味着sql Server认为它们都是相同的字符.
但是,在其他环境中,例如C#,它们并不相同.
我很困惑的是:
>字符串比较如何在sql Server中工作
>为什么比较在一台机器和一个平台上的行为不同,但环境不同
>这4个字符代表一个人类可理解的角色.为什么它们在Unicode字符映射中如此丰富?
这当然会带来巨大的问题,因为我正在开发一个文本处理应用程序,数据几乎来自任何地方,我需要在处理之前对文本进行规范化.
如果我知道差异的原因,我可能会找到一个解决方案来处理它.
谢谢.
解决方法
sql Server中的所有字符数据都与排序规则相关联,排序规则确定可以存储的字符的域以及用于比较和排序数据的规则.排序规则适用于Unicode和非Unicode数据.
sql Server包括3大类排序规则:二进制,旧版和Windows.二进制类别中的排序规则(_BIN后缀)使用基础代码点进行比较,因此如果代码点不同于字符,则相等比较返回不相等. Legacy(sql_前缀)和Windows排序规则为更自然的字典规则提供排序和比较语义.这允许比较考虑大小写,重音,宽度和假名. Windows排序规则提供了更强大的单词排序规则,与Windows操作系统紧密结合,而旧排序规则只考虑单个字符.
下面的示例说明了Windows和二进制排序规则与Teth字符之间的区别:
CREATE TABLE dbo.WindowsColationExample ( Character1 nchar(1) COLLATE Arabic_100_CI_AS_SC,Character2 nchar(1) COLLATE Arabic_100_CI_AS_SC,Character3 nchar(1) COLLATE Arabic_100_CI_AS_SC,Character4 nchar(1) COLLATE Arabic_100_CI_AS_SC ); CREATE TABLE dbo.BinaryColationExample ( Character1 nchar(1) COLLATE Arabic_100_BIN,Character2 nchar(1) COLLATE Arabic_100_BIN,Character3 nchar(1) COLLATE Arabic_100_BIN,Character4 nchar(1) COLLATE Arabic_100_BIN ); INSERT INTO dbo.BinaryColationExample VALUES ( NCHAR(65217),NCHAR(65218),NCHAR(65219),NCHAR(65220) ); INSERT INTO dbo.WindowsColationExample VALUES ( NCHAR(65217),NCHAR(65220) ); --all characters compare not equal SELECT * FROM dbo.BinaryColationExample WHERE character1 = character2 OR character1 = character3 OR character1 = character4 OR character2 = character3 OR character2 = character4 OR character3 = character4; --all characters compare equal SELECT * FROM dbo.WindowsColationExample WHERE character1 = character2; SELECT * FROM dbo.WindowsColationExample WHERE character1 = character3; SELECT * FROM dbo.WindowsColationExample WHERE character1 = character4; SELECT * FROM dbo.WindowsColationExample WHERE character2 = character3; SELECT * FROM dbo.WindowsColationExample WHERE character2 = character4; SELECT * FROM dbo.WindowsColationExample WHERE character3 = character4;
关于为什么Unicode可能包含相同字形的不同代码点的原因在http://en.wikipedia.org/wiki/Duplicate_characters_in_Unicode中概述.我总结,它可能是为了遗留兼容性或字符在规范上不等同.请注意,Teth字符ط用于不同的语言(http://en.wikipedia.org/wiki/Teth).