nvarchar(Unicode)列的集合意义是什么?

问题描述 投票:13回答:3

我对此有很多了解。

还有一些问题:

这里我不是在谈论区分大小写...

  • 如果我有一个字符(例如ש,并且他存储在nvarchar中-它可以容纳任何内容,为什么我在这里需要collation

    ]
  • 如果我是“ FaceBook”,并且我需要能够存储来自all语言的all字符,归类和我的nvarchar列之间的关系是什么?

提前感谢。

sql-server sql-server-2008 unicode collation nvarchar
3个回答
13
投票
存储和表示字符是一回事,而知道如何对它们进行排序和比较是另一回事。

Unicode数据,存储在SQL Server的XMLN前缀类型中,可以用一个字符集表示所有语言中的所有字符(大部分是其目标)。因此,对于NCHAR / NVARCHAR数据(我不再使用NTEXT,因为它不再应使用,而XML因为它不受归类影响),归类不会更改可以存储的字符。对于CHARVARCHAR数据,归类

do影响可以存储的内容,因为每个归类指向一个特定的代码页,该代码页确定可以在值128-255中存储的内容。

现在,虽然所有字符都有默认的排序顺序,但可能无法在所有语言和文化之间都起作用。有许多语言共享某些/许多/所有字符,但是对于如何对它们进行排序有不同的规则。例如,在使用字母的大多数字母中,字母“ C”位于字母“ D”之前。在美国英语中,“ C”和“ H”(即“ CH”作为两个单独的字母)的组合自然会出现在以“ D”开头的任何字符串之前。但是,在某些语言中,“ CH”的两个字母的组合是特殊的,并且对

after

“ 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排序规则(以SQL_开头的排序规则

not

)基于Unicode 5.0或6.0,具体取决于所使用的操作系统以及所安装的.NET Framework的版本(有关详细信息,请参见SortVersion。)>所以这就是归类所要做的。如果要查看所有可用的排序规则,请运行以下命令:

SELECT [name] FROM sys.fn_helpcollations() ORDER BY [name];

如果您有一个字符,则没有顺序。但是,例如,如果您订购“人的名字”,则根据排序规则,不同语言的不同特殊字符的排序将有所不同。

第一个排序规则可能区分大小写-在b之前显示所有B-第二个特殊字符具有取决于排序规则的特殊规则。

文档在此方面相当不错。

我认为原始张贴者在CODE PAGES和COLLATIONS之间感到困惑。

nvarchar / nchar中的“ n”允许您使用Unicode码集来存储文本,该码集足够大,可以用唯一的数字合并所有语言中的所有字符(原则上无论如何都如此)。这本身与归类无关。 nvarchar / nchar不使用“代码页”来编码/解码每个字符代码的含义。

归类定义字符的排序顺序,哪些字符变体应被视为相同。 nvarchar / nchar确实使用COLLATIONS来定义这些区别。


6
投票
如果您有一个字符,则没有顺序。但是,例如,如果您订购“人的名字”,则根据排序规则,不同语言的不同特殊字符的排序将有所不同。

6
投票
我认为原始张贴者在CODE PAGES和COLLATIONS之间感到困惑。
© www.soinside.com 2019 - 2024. All rights reserved.