sql-server – nvarchar(Unicode)列的COLLATIONS的要点是什么?

前端之家收集整理的这篇文章主要介绍了sql-server – nvarchar(Unicode)列的COLLATIONS的要点是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我读了很多关于这个.

还有一些问题:

我不在乎这里的区分大小写

>如果我有一个char(例如),并且他被存储在nvarchar中 – 它可以容纳任何东西,为什么我需要在这里整理?
>如果我是“FaceBook”,我需要存储所有语言的所有字符,排序规则和我的nvarchar列之间的关系是什么?

提前致谢.

解决方法

存储和表示字符是一回事,知道如何排序和比较它们是另一回事.

存储在sql Server中的XML和N前缀类型中的Unicode数据可以使用单个字符集来表示所有语言(大部分,也就是其目标)的所有字符.因此,对于XML / NCHAR / NVARCHAR数据(我将不再使用NTEXT,因此不再使用),Collat​​ions不会更改可以存储的字符.对于CHAR和VARCHAR数据,排序确实会影响每个排序规则指向特定代码页可以存储的内容,从而确定了可以存储在值128 – 255中的内容.

现在,虽然所有字符都有一个默认的排序顺序,但这些排序顺序不一定适用于所有语言和文化.有许多语言共享一些/许多/所有字符,但是有不同的规则来排序它们.例如,在使用这些字母的大部分字母中,字母“C”都在字母“D”之前.在美国英语中,“C”和“H”(即“CH”作为两个单独的字母)的组合自然会出现在以“D”开始的任何字符串之前.但是,在几种语言中,“CH”的两个字母组合是特殊的,在“D”之后是:

IF (   N'CH' COLLATE Czech_CI_AI > N'D' COLLATE Czech_CI_AI
   AND N'C'  COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
   AND N'CI' COLLATE Czech_CI_AI < N'D' COLLATE Czech_CI_AI
   ) PRINT 'Czech_CI_AI';

IF (   N'CH' COLLATE Czech_100_CI_AI > N'D' COLLATE Czech_100_CI_AI
   AND N'C'  COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
   AND N'CI' COLLATE Czech_100_CI_AI < N'D' COLLATE Czech_100_CI_AI
   ) PRINT 'Czech_100_CI_AI';

IF (   N'CH' COLLATE Slovak_CI_AI > N'D' COLLATE Slovak_CI_AI
   AND N'C'  COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
   AND N'CI' COLLATE Slovak_CI_AI < N'D' COLLATE Slovak_CI_AI
   ) PRINT 'Slovak_CI_AI';

IF (   N'CH' COLLATE Slovak_CS_AS > N'D' COLLATE Slovak_CS_AS
   AND N'C'  COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
   AND N'CI' COLLATE Slovak_CS_AS < N'D' COLLATE Slovak_CS_AS
   ) PRINT 'Slovak_CS_AS';

IF (   N'CH' COLLATE Latin1_General_100_CI_AS > N'D' COLLATE Latin1_General_100_CI_AS
   AND N'C'  COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
   AND N'CI' COLLATE Latin1_General_100_CI_AS < N'D' COLLATE Latin1_General_100_CI_AS
   ) PRINT 'Latin1_General_100_CI_AS'
ELSE PRINT 'Nope!';

返回:

Czech_CI_AI
Czech_100_CI_AI
Slovak_CI_AI
Slovak_CS_AS
Nope!

要查看各种文化排序规则的示例,请参阅:Collation Charts.

此外,在某些语言中,某些字母或字母的组合等同于其他字母,而不是大多数其他语言.例如,只有在丹麦语中,“å”等同于“aa”.但是,“å”不等于只有一个“a”:

IF (N'aa' COLLATE Danish_Greenlandic_100_CI_AI =  N'å' COLLATE Danish_Greenlandic_100_CI_AI
AND N'a'  COLLATE Danish_Greenlandic_100_CI_AI <> N'å' COLLATE Danish_Greenlandic_100_CI_AI
   ) PRINT 'Danish_Greenlandic_100_CI_AI';

IF (   N'aa' COLLATE Danish_Norwegian_CI_AI =  N'å' COLLATE Danish_Norwegian_CI_AI
   AND N'a'  COLLATE Danish_Norwegian_CI_AI <> N'å' COLLATE Danish_Norwegian_CI_AI
   ) PRINT 'Danish_Norwegian_CI_AI';

IF (   N'aa' COLLATE Latin1_General_100_CI_AI =  N'å' COLLATE Latin1_General_100_CI_AI
   AND N'a'  COLLATE Latin1_General_100_CI_AI <> N'å' COLLATE Latin1_General_100_CI_AI
   ) PRINT 'Latin1_General_100_CI_AI'
ELSE PRINT 'Nope!';

返回:

Danish_Greenlandic_100_CI_AI
Danish_Norwegian_CI_AI
Nope!

这是非常复杂的,我甚至没有提到处理右至左语言(希伯来语和阿拉伯语),中文,日文,字符组合等.

如果您想要深入了解规则,请查看Unicode Collation Algorithm (UCA).上面的示例基于该文档中的示例,尽管我不认为UCA中的所有规则都已被实现,尤其是从Windows归类(归类不是取决于您使用的操作系统和安装的.NET Framework的版本(请参阅SortVersion的详细信息),基于Unicode 5.0或6.0.

这就是Collat​​ions做的.如果您想查看所有可用的排序规则,只需运行以下命令:

SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name];
原文链接:https://www.f2er.com/mssql/76063.html

猜你在找的MsSQL相关文章