A K Asked:2020-01-20 03:27:43 +0000 UTC2020-01-20 03:27:43 +0000 UTC 2020-01-20 03:27:43 +0000 UTC 排序规则 Cyrillic_General 和 Cyrillic_General_100 之间的区别 772 我在 Windows 2016 Server 上安装 SQL Server 2016 Express Edition,我想选择一个 Cyrillic 排序规则,但其中有两个:Cyrillic_General 和 Cyrillic_General_100 它们之间有什么区别?我怀疑我的选择。我看到几乎所有的映射都有两个选项(有和没有_100),这是什么意思,有什么用? sql-server 2 个回答 Voted Best Answer i-one 2020-01-25T04:41:09Z2020-01-25T04:41:09Z Cyrillic_General 和 Cyrillic_General_100 它们之间有什么区别? 据我研究过这个问题,俄语字母(A-Z,a- z )的字符,以及拉丁字母、数字和符号(代码为0x0020-0x007E)在Cyrillic_General中的处理方式相同和Cyrillic_General_100 。但是,俄语中未使用的西里尔字符有所不同。 例如,在 Unicode 字符表中, Cyrillic_General_CI_AI 中Cyrillic 范围内的第一个字母- Ѐ(带有坟墓的 e)被视为不等于字母Ё,而在Cyrillic_General_100_CI_AI中,字母Ѐ和Ё是相等的(如果变音符号是忽略,显然更正确): SELECT eq = IIF(ch1_ci_ai = ch2_ci_ai, '=', '<>'), eq_100 = IIF(ch1_100_ci_ai = ch2_100_ci_ai, '=', '<>') FROM (VALUES (N'Ѐ', N'Ё')) c(ch1, ch2) CROSS APPLY ( SELECT ch1_ci_ai = c.ch1 COLLATE Cyrillic_General_CI_AI, ch2_ci_ai = c.ch2 COLLATE Cyrillic_General_CI_AI, ch1_100_ci_ai = c.ch1 COLLATE Cyrillic_General_100_CI_AI, ch2_100_ci_ai = c.ch2 COLLATE Cyrillic_General_100_CI_AI ) c2 此外,在Cyrillic_General中,字母Ѐ和ѐ未正确转换为相反的大小写,而在Cyrillic_General_100中,它们的大小写转换是正确的: SELECT le = LOWER(N'Ѐ' COLLATE Cyrillic_General_CI_AI), ue = UPPER(N'ѐ' COLLATE Cyrillic_General_CI_AI), le_100 = LOWER(N'Ѐ' COLLATE Cyrillic_General_100_CI_AI), ue_100 = UPPER(N'ѐ' COLLATE Cyrillic_General_100_CI_AI) 其他一些西里尔字符(以及非西里尔字符)也存在差异。 我怀疑我的选择。 一般来说,对于新的开发,最好选择最新的版本 - 通常,这些是名称中包含_100 的版本(对于日语,_140版本出现在 SqlServer 2017 中)。如果您需要确保与某些现有系统的兼容性 - 根据他们使用的内容进行选择。 另请注意,实例的排序规则是在安装期间设置的。对于稍后创建的数据库,您始终可以指定任何其他所需的排序规则(如果未指定,将使用实例的排序规则创建数据库)。因此,如果您在数据库、登录名、服务器角色和其他实例范围的名称中不使用俄语字母字符,那么原则上您甚至可以选择Latin1_General_100。 Denis Rubashkin 2020-01-23T18:14:07Z2020-01-23T18:14:07Z 从 MS SQL Server 2008 开始就引入了排序规则_100。一般来说,最好使用新的排序规则,除了一些与“古老”应用程序支持相关的细节。 SQL Server 2008 排序规则中的新增功能 我想提请您注意的要点是: 权重已添加到以前可以平等比较的非加权字符。 关键是以前有很多字符(通常是不可打印的)没有指定“重量”,因此在比较时,它们被认为是相同的,尽管实际上它们是不同的。
据我研究过这个问题,俄语字母(A-Z,a- z )的字符,以及拉丁字母、数字和符号(代码为0x0020-0x007E)在Cyrillic_General中的处理方式相同和Cyrillic_General_100 。但是,俄语中未使用的西里尔字符有所不同。
例如,在 Unicode 字符表中, Cyrillic_General_CI_AI 中Cyrillic 范围内的第一个字母- Ѐ(带有坟墓的 e)被视为不等于字母Ё,而在Cyrillic_General_100_CI_AI中,字母Ѐ和Ё是相等的(如果变音符号是忽略,显然更正确):
此外,在Cyrillic_General中,字母Ѐ和ѐ未正确转换为相反的大小写,而在Cyrillic_General_100中,它们的大小写转换是正确的:
其他一些西里尔字符(以及非西里尔字符)也存在差异。
一般来说,对于新的开发,最好选择最新的版本 - 通常,这些是名称中包含_100 的版本(对于日语,_140版本出现在 SqlServer 2017 中)。如果您需要确保与某些现有系统的兼容性 - 根据他们使用的内容进行选择。
另请注意,实例的排序规则是在安装期间设置的。对于稍后创建的数据库,您始终可以指定任何其他所需的排序规则(如果未指定,将使用实例的排序规则创建数据库)。因此,如果您在数据库、登录名、服务器角色和其他实例范围的名称中不使用俄语字母字符,那么原则上您甚至可以选择Latin1_General_100。
从 MS SQL Server 2008 开始就引入了排序规则_100。一般来说,最好使用新的排序规则,除了一些与“古老”应用程序支持相关的细节。
SQL Server 2008 排序规则中的新增功能
我想提请您注意的要点是:
关键是以前有很多字符(通常是不可打印的)没有指定“重量”,因此在比较时,它们被认为是相同的,尽管实际上它们是不同的。