加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2021-01-08 17:52:24 所属栏目:MsSql教程 来源:网络整理
导读:我只是不明白.看到这个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(6

我只是不明白.看到这个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).

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读