sql-server – 为什么这些字符在SQL Server中都是相同的?

前端之家收集整理的这篇文章主要介绍了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中工作
>为什么比较在一台机器和一个平台上的行为不同,但环境不同
>这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).

猜你在找的MsSQL相关文章