sql-server – 为什么这些字符在SQL Server中都是相同的?
我只是不明白.看到这个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中工作 这当然会带来巨大的问题,因为我正在开发一个文本处理应用程序,数据几乎来自任何地方,我需要在处理之前对文本进行规范化. 如果我知道差异的原因,我可能会找到一个解决方案来处理它. 解决方法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). (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |