Sql Server 2008 - 排序规则类型之间的区别

Posted

技术标签:

【中文标题】Sql Server 2008 - 排序规则类型之间的区别【英文标题】:Sql Server 2008 - Difference between collation types 【发布时间】:2010-10-06 14:20:18 【问题描述】:

我正在安装一个新的 SQL Server 2008 服务器,但在获取有关不同排序规则的任何可用信息时遇到了一些问题。我搜索了 SQL Server BOL 并用谷歌搜索了答案,但似乎无法找到任何可用的信息。

    Windows 排序规则"Finnish_Swedish_100""Finnish_Swedish" 有什么区别?

    我认为"_100"-version 是 SQL Server 2008 中的更新排序规则,但如果是这种情况,与旧版本相比有哪些变化?

    启用"Accent-sensitive" 通常是件好事吗?我知道这取决于任务等等,但是有什么众所周知的利弊需要考虑吗?

    "Binary""Binary-code point" 参数,在哪些情况下应该启用这些参数?

【问题讨论】:

【参考方案1】:

解决问题 2:

是的,如果给定语言需要重音语法。

【讨论】:

【参考方案2】:

使用下面的查询自己尝试一下。

如您所见,å、ä 等不计为重音字符,并且在使用芬兰语/瑞典语排序规则时根据瑞典语字母进行排序。

但是,仅当您使用 AS 排序规则时才会考虑重音符号。对于AI 排序规则,它们的顺序没有改变,就好像根本没有重音一样。

CREATE TABLE #Test (
    Number int identity,
    Value nvarchar(20) NOT NULL
);
GO

INSERT INTO #Test VALUES ('àá');
INSERT INTO #Test VALUES ('áa');
INSERT INTO #Test VALUES ('aa');
INSERT INTO #Test VALUES ('aà');

INSERT INTO #Test VALUES ('áb');
INSERT INTO #Test VALUES ('ab');

-- w is considered an accented version of v
INSERT INTO #Test VALUES ('wa');
INSERT INTO #Test VALUES ('va');
INSERT INTO #Test VALUES ('zz');
INSERT INTO #Test VALUES ('åä');
GO

SELECT Number, Value FROM #Test ORDER BY Value COLLATE Finnish_Swedish_CI_AS;
SELECT Number, Value FROM #Test ORDER BY Value COLLATE Finnish_Swedish_CI_AI;
GO

DROP TABLE #Test;
GO

【讨论】:

【参考方案3】:

字母 ÅÄÖ/åäö 不会与 A 和 O 混淆,只需将排序规则设置为 AI(不区分重音)。然而,对于 â 和其他不属于瑞典字母表的“组合”作为单个字母来说,情况确实如此。 â 将根据相关设置混合或不混合。

由于我还有很多旧数据库需要通信,也使用链接服务器,所以我选择了 FINNISH _SWEDISH _CI _AS,因为我正在安装 SQL2008。当 Windows 排序规则首次出现在 SQL Server 中时,这是 FINNISH _SWEDISH 的默认设置。

【讨论】:

【参考方案4】:

关于问题 2 和 3

如果您接受用户数据,我建议您将口音敏感度关闭,如果您有干净、经过消毒的数据,则建议将其打开。 我自己不是芬兰人,我不知道有多少单词会根据其中的 ó õ 或 ö 而有所不同。但是如果有用户输入数据,你可以确定他们在使用上不会保持一致,并且你希望能够匹配他们。 如果您从一个数据集中收集数据,并且您知道其内容和一致性,那么您将需要打开 Accent Sensitivity ON,因为您知道这些差异是有目的的。

在考虑问题 3 时,同样的问题也适用。(我主要从 Tomalak 提供的链接中得到这个)如果数据区分大小写和重音,那么您需要 _BIN,因为它会更快地排序。如果数据不规则,并且不区分大小写/重音,那么您将需要 _BIN2,因为它是为 Unicode 数据设计的。

【讨论】:

作为瑞典语,我可以告诉你,字母 åäö 在我们的语言中经常使用。因此,在大多数情况下,您可能希望能够对它们进行正确排序。 我为我的无知道歉,但是,如果“ö”不可用,您会直接使用“o”还是完全改变这个词? 在大多数情况下,它只会创建一个真正意味着任何东西的单词,其中包含 ö 而不是 o。如果这也用于上下文中,我相信瑞典人在理解其含义方面不会有任何问题。不过,用户希望能够在瑞典系统中使用 åäö。 :)【参考方案5】:

解决问题 3(信息取自 MSDN;措辞他们的,格式我的):

二进制 (_BIN):

根据为每个字符定义的位模式对 SQL Server 表中的数据进行排序和比较。 二进制排序顺序区分大小写和重音。 二进制也是最快的排序顺序。 如果未选择此选项,SQL Server 将遵循相关语言或字母的字典中定义的排序和比较规则。

二进制代码点 (_BIN2):

对于 Unicode 数据:根据 Unicode 代码点对 SQL Server 表中的数据进行排序和比较。 对于非 Unicode 数据:将使用与二进制排序相同的比较。

使用二进制代码点排序顺序的优点是没有数据重新排序 在比较排序的 SQL Server 数据的应用程序中是必需的。因此,二进制代码点排序顺序提供了更简单的应用程序开发和可能的性能提升。

如需了解更多信息,请参阅Guidelines for Using BIN and BIN2 Collations。

【讨论】:

【参考方案6】:

_100表示​​SQL Server 2008新增的排序规则,_90是2005的,没有后缀的是2000。不知道有什么区别,也找不到文档。除非您正在对另一个不同版本的 SQL 服务器进行链接服务器查询,否则我很想使用 _100 的。抱歉,我无法解决这些差异。

【讨论】:

好的,谢谢你的信息。我决定使用排序规则“Finnish_Swedish_100_CI_AS”,因为该数据库将与正在开发的新应用程序一起使用。【参考方案7】:

解决您的问题 1. 启用芬兰语-瑞典语对口音敏感是一件好事。否则你的 "å"s 和 "ä"s 将被排序为 "a"s 和 "ö"s 作为 "o"s。 (假设您将使用这些国际字符)。

更多:http://msdn.microsoft.com/en-us/library/ms143515.aspx(讨论二进制代码点和重音敏感度)

【讨论】:

@Octadrone:您可能知道:瑞典重音字符的预期排序顺序是什么? “å”是单独排序还是与字母“a”的其他形式混在一起? 预期的排序顺序是 [...] x y z å ä ö。都不同。但是,“v”和“w”被排序为同一个字母。 -1:不正确,在芬兰语/瑞典语排序规则中,圆环和元音变音不被视为重音。

以上是关于Sql Server 2008 - 排序规则类型之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 R2 中不同数据库排序规则之间的排序规则冲突

如何在 SQL Server 2008 R2 中更改服务器排序规则

无法解决排序规则冲突 - SQL Server 2008 R2 SP1

SQL Server 为 SQL Server 2008 R2 的英文版,如何将 master 数据库的排序规则改为Chinese_PRC_CL_AS

使用 2 个版本的 SQL Server 的排序规则冲突

在sql server 2005中保存其他国家特殊字符