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