Beterson Asked: 2022-05-27 16:16:45 +0800 CST 2022-05-27 16:16:45 +0800 CST 2022-05-27 16:16:45 +0800 CST COLLATE 的方式、时间和功能 772 我想问一下它COLLATE SQL_Latin1_General_CP1_CI_AS什么时候使用以及它的主要功能是什么,因为我不太了解该功能并且我已经看到它用于WHERE sql 1 Answers Voted Best Answer jachguate 2022-05-27T18:24:24+08:002022-05-27T18:24:24+08:00 SQL Server 中的排序规则 根据文档, collation或collate在西班牙语中称为collation是: SQL Server 排序规则为数据提供区分大小写的属性、重音符号和排序规则。与字符数据类型(例如 char 和 varchar)一起使用的排序规则规定了代码页和可以为该数据类型表示的相应字符。 这种排序规则适用于各个级别,例如,SQL Server 实例有一个默认排序规则,每个数据库都有一个默认排序规则,最后,每个字符数据类型的列,例如char,varchar都有自己的排序规则。未指定排序规则的列是使用数据库的默认排序规则创建的。 在未指定排序规则的情况下创建的数据库是使用数据库实例的默认排序规则创建的。 实际上,这种排序规则定义了在进行相等或不相等比较时何时发生匹配,以及结果集的排序。 在第一种情况下,我们将创建一个具有不同排序规则的三列的表,并在其中插入一些数据: create table #prueba ( id int not null identity(1, 1) , str1 varchar(100) collate SQL_Latin1_General_CP1_CI_AS , str2 varchar(100) collate Latin1_General_100_CI_AI , str3 varchar(100) collate Latin1_General_100_CS_AS ); insert into #prueba(str1, str2, str3) values ('Hernández', 'HERNANDEZ', 'HERNÁNDEZ') , ('Hernandez', 'Hernández', 'HERNANDEZ') , ('HERNÁNDEZ', 'Hernandez', 'Hernández') , ('HERNANDEZ', 'HERNÁNDEZ', 'Hernandez') ; 与常量字符串的比较 现在,让我们运行一些查询并查看它们的结果: select * from #Prueba where str1 = 'Hernández' id str1 str2 str3 ---- ------------ ------------ ------------- 1 Hernández HERNANDEZ HERNÁNDEZ 3 HERNÁNDEZ Hernandez Hernández (2 rows affected) select * from #Prueba where str2 = 'Hernández' id str1 str2 str3 ---- ------------ ------------ ------------- 1 Hernández HERNANDEZ HERNÁNDEZ 2 Hernandez Hernández HERNANDEZ 3 HERNÁNDEZ Hernandez Hernández 4 HERNANDEZ HERNÁNDEZ Hernandez (4 rows affected) select * from #Prueba where str3 = 'Hernández' id str1 str2 str3 ---- ------------ ------------ ------------- 3 HERNÁNDEZ Hernandez Hernández (1 row affected) 如您所见,应用于不同列的相同相等条件返回不同的结果,2、4 和 1 行每次与字符串 'Hernández' 匹配。 IC/CS AI/AS 这是因为某些排序规则区分大小写或不区分大小写(CS=Case Sensitive 或 CI=Case Insensitive)。在不区分大小写的排序规则中,A它等于a,而在区分大小写的排序规则中则不是。 还有一些排序规则对重音敏感。(AS=对口音敏感,AI=对口音不敏感)。在Accent Insensitive collat ion中,á它等于a,而在Accent Sensitive中,它们不相等。 我们有所有可能的组合,CI_AI、CI_AS、CS_AI、CS_AS。在 CI_AI 中,它á等于A,在 CS_ASá中它只等于它自己。 列之间的比较 当您尝试比较具有不同排序规则的两列时,SQL Server 将生成错误,在我的情况下: select * from #Prueba where str1 = str2; 产生 Msg 468, Level 16, State 9, Line 29 Cannot resolve the collation conflict between "Latin1_General_100_CI_AI" and "SQL_Latin1_General_CP1_CI_AS" in the equal to operation. 这基本上是说,通过使用不同的规则来确定每个字符串的匹配,引擎无法决定应用哪个规则。 为了解决这个问题,我们可以使用语法明确指出我们想要对任何给定列应用哪种排序规则columna collate nombre_intercalación。因此,例如,我们可以将另一列的排序规则应用于一列: select * from #Prueba where str1 collate Latin1_General_100_CI_AI = str2; id str1 str2 str3 ---- ------------ ------------ ------------- 1 Hernández HERNANDEZ HERNÁNDEZ 2 Hernandez Hernández HERNANDEZ 3 HERNÁNDEZ Hernandez Hernández 4 HERNANDEZ HERNÁNDEZ Hernandez (4 rows affected) 或者,我们可以同时应用与它们所拥有的不同的排序规则,只要我们对等式的两边都应用相同的排序规则: select * from #Prueba where str1 collate Latin1_General_100_CS_AS = str2 collate Latin1_General_100_CS_AS; id str1 str2 str3 ---- ------------ ------------ ------------- (0 rows affected) 订购 最后,排序,我留给读者,这个答案对于 StackOverflow 格式来说已经太长了,试试不同的语句: select * from #Prueba order by str1; select * from #Prueba order by str2; select * from #Prueba order by str3; 有哪些排序规则可用: SQL Server 带有大量排序规则,可用于不同的世界区域、语言和使用模式。您可以使用以下查询查看实例中所有可用排序规则的列表: SELECT name, description FROM sys.fn_helpcollations() 推荐 对于一般的拉丁语言,建议使用Latin1_General_100*,特别是对于西班牙语,Modern_Spanish*
SQL Server 中的排序规则
根据文档, collation或collate在西班牙语中称为collation是:
这种排序规则适用于各个级别,例如,SQL Server 实例有一个默认排序规则,每个数据库都有一个默认排序规则,最后,每个字符数据类型的列,例如
char
,varchar
都有自己的排序规则。未指定排序规则的列是使用数据库的默认排序规则创建的。在未指定排序规则的情况下创建的数据库是使用数据库实例的默认排序规则创建的。
实际上,这种排序规则定义了在进行相等或不相等比较时何时发生匹配,以及结果集的排序。
在第一种情况下,我们将创建一个具有不同排序规则的三列的表,并在其中插入一些数据:
与常量字符串的比较
现在,让我们运行一些查询并查看它们的结果:
如您所见,应用于不同列的相同相等条件返回不同的结果,2、4 和 1 行每次与字符串 'Hernández' 匹配。
IC/CS AI/AS
这是因为某些排序规则区分大小写或不区分大小写(CS=Case Sensitive 或 CI=Case Insensitive)。在不区分大小写的排序规则中,
A
它等于a
,而在区分大小写的排序规则中则不是。还有一些排序规则对重音敏感。(AS=对口音敏感,AI=对口音不敏感)。在Accent Insensitive collat ion中,
á
它等于a
,而在Accent Sensitive中,它们不相等。我们有所有可能的组合,CI_AI、CI_AS、CS_AI、CS_AS。在 CI_AI 中,它
á
等于A
,在 CS_ASá
中它只等于它自己。列之间的比较
当您尝试比较具有不同排序规则的两列时,SQL Server 将生成错误,在我的情况下:
产生
这基本上是说,通过使用不同的规则来确定每个字符串的匹配,引擎无法决定应用哪个规则。
为了解决这个问题,我们可以使用语法明确指出我们想要对任何给定列应用哪种排序规则
columna collate nombre_intercalación
。因此,例如,我们可以将另一列的排序规则应用于一列:或者,我们可以同时应用与它们所拥有的不同的排序规则,只要我们对等式的两边都应用相同的排序规则:
订购
最后,排序,我留给读者,这个答案对于 StackOverflow 格式来说已经太长了,试试不同的语句:
有哪些排序规则可用:
SQL Server 带有大量排序规则,可用于不同的世界区域、语言和使用模式。您可以使用以下查询查看实例中所有可用排序规则的列表:
推荐
对于一般的拉丁语言,建议使用
Latin1_General_100*
,特别是对于西班牙语,Modern_Spanish*