gpt4 book ai didi

sql-server - nvarchar (Unicode) 列的 COLLATIONS 有何意义?

转载 作者:行者123 更新时间:2023-12-02 07:45:36 24 4
gpt4 key购买 nike

我读了很多这方面的内容。

还有一些问题:

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

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

  • 如果我是“FaceBook”并且我需要存储 all 的能力来自 all 的字符语言,排序规则和我的 nvarchar 列之间的关系是什么?

提前致谢。

最佳答案

存储和表示字符是一回事,了解如何对它们进行排序和比较又是另一回事。

Unicode 数据在 SQL Server 中以 XMLN 前缀类型存储,可以表示所有语言中的所有字符(在大多数情况下,这是它的目标)具有单个字符集。因此,对于 NCHAR/NVARCHAR 数据(我省略了 NTEXT 因为它不应该再使用,而 XML > 因为它不受排序规则的影响),排序规则不会更改可以存储的字符。对于 CHARVARCHAR 数据,排序规则确实会影响可以存储的内容,因为每个排序规则都指向特定的代码页,这决定了可以存储的内容存储在值 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 排序规则(排序规则SQL_) 基于 Unicode 5.0 或 6.0,具体取决于您使用的操作系统以及安装的 .NET Framework 的版本(有关详细信息,请参阅 SortVersion)。

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

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

关于sql-server - nvarchar (Unicode) 列的 COLLATIONS 有何意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9756769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com