Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server NVarchar、Bin排序规则和Bin2排序规则之间有什么区别?_Sql Server_Unicode_Collation - Fatal编程技术网

Sql server NVarchar、Bin排序规则和Bin2排序规则之间有什么区别?

Sql server NVarchar、Bin排序规则和Bin2排序规则之间有什么区别?,sql-server,unicode,collation,Sql Server,Unicode,Collation,所有3个选项都区分大小写和重音,并支持Unicode。 根据文件: NVarchar根据相关语言或字母表的词典对数据进行排序和比较 Bin根据位模式对数据进行排序和比较 Bin2基于Unicode数据的Unicode代码点对数据进行排序和比较 为了简化复杂的事情,我可以说Bin是NVarchar的改进,Bin2是Bin的改进;除非我被限制为向后兼容,否则总是建议使用Bin2或至少Bin,以享受更好的性能 ==============================================

所有3个选项都区分大小写和重音,并支持Unicode。 根据文件:

NVarchar根据相关语言或字母表的词典对数据进行排序和比较

Bin根据位模式对数据进行排序和比较

Bin2基于Unicode数据的Unicode代码点对数据进行排序和比较

为了简化复杂的事情,我可以说Bin是NVarchar的改进,Bin2是Bin的改进;除非我被限制为向后兼容,否则总是建议使用Bin2或至少Bin,以享受更好的性能

========================================================================= 我会尝试再次解释我自己

看看:

If Object_ID('words2','U') Is Not Null Drop Table words2;
Create  Table words2(word1 NVarchar(20),
                    word2 NVarchar(20) Collate Cyrillic_General_BIN,
                    word3 NVarchar(20) Collate Cyrillic_General_BIN2);

Insert
Into    words2
Values  (N'ھاوتایی',N'ھاوتایی',N'ھاوتایی'),
        (N'Συμμετρία',N'Συμμετρία',N'Συμμετρία'),
        (N'אבַּג',N'אבַּג',N'אבַּג'),
        (N'対称性',N'対称性',N'対称性');
Select * From words2;
无论排序规则是什么,所有3个选项都支持各种字母表

问题是——这三个选项之间的实际区别是什么?假设我想用不同的字母表存储私有名称,我可以使用哪个选项?我想我必须找到具体的名字来选择。。从…起其中..,订单名称选择。。从…起Order By…

nvarchar是一种数据类型,BIN或BIN2排序规则就是这种排序规则序列。它们是两种不同的东西

使用nvarchar列存储unicode字符数据:

nchar和nvarchar Transact-SQL

固定长度、nchar或可变长度、nvarchar、Unicode数据并使用Unicode UCS-2字符集的字符串数据类型

nvarchar列将具有关联的排序规则序列,该序列定义字符的排序和比较方式。这也可以为整个数据库设置

整理Transact-SQL

是一个子句,可应用于数据库定义或列定义以定义排序规则,或应用于字符串表达式以应用排序规则转换

因此,在SQL server中处理字符数据时,始终使用字符数据类型nvarchar、varchar、nchar或char,并根据区分大小写、区分重音等需要使用适当的排序规则

例如,在我的工作中,我通常使用拉丁文1_General_CI_AI排序。这适用于拉丁字符集,并为查询提供不区分大小写和不区分重音的匹配。 这意味着以下字符串均被视为相等:

霍尔,霍尔,霍尔,霍尔,霍尔 这是理想的系统,其中可能有包含上述重音字符的单词,但您不能确定用户在搜索内容时是否会输入重音

如果您只需要区分大小写,那么可以使用CI_作为区分重音的排序规则

_-BIN排序规则用于二进制比较,将每个不同的字符视为不同的字符,不用于一般的文本比较

编辑更新的问题:

如果您总是使用nvarchar而不是varchar列,那么无论使用何种排序规则,您总是支持所有unicode代码点

在您的示例查询中没有实际的区别,因为它只是一个简单的插入和选择。还请记住,您的第一个word1列将使用数据库或服务器的默认排序规则-始终使用排序规则

如果对nvarchar列使用条件或按它们排序,则会出现差异。这就是排序规则的作用——它们定义了在比较和排序时应将哪些字符视为等效字符

我不能说任何关于西里尔文的东西,但是在拉丁字符的情况下,使用拉丁1_General_CI_AI排序,那么像Aá等字符都是等价的-大小写和重音被忽略

想象一下,如果将字符串Aaá–存储在word1列中,那么查询SELECT*FROM words2,其中word1='aaaa'将返回您的行

如果使用_-BIN排序规则,则所有这些字符都被视为不同的,并且上面的查询不会返回行。我想不出在处理文本数据时会使用_-BIN排序规则的情况。编辑2:事实上,我可以-存储密码哈希将是一个很好的地方使用二进制排序,以便比较是准确的。差不多就这些了

我希望这能让事情更清楚

所有3个选项都区分大小写和重音,并支持Unicode

NVARCHAR是一种类似INT、DATETIME等的数据类型,而不是一个选项。它以UCS-2/UTF-16小尾端编码存储Unicode字符。UCS-2和UTF-16是U+0000到U+FFFF十进制值0-65535范围内的相同代码点。UTF-16处理U+10000及以上的代码点(称为补充字符),所有这些代码点都定义为UCS-2范围内的代码点对(称为代理项对)。由于两者之间的字节序列相同,因此唯一的dif