COLLATE在数据库或表中的后果是什么

时间:2014-05-22 08:25:08

标签: mysql sql-server db2

1 / 有时你写

     ALTER DATABASE [MyDb] COLLATE SQL_Latin1_General_CP1_CI_AS
过了一会儿,如果你试试

     ALTER DATABASE [MyDb] COLLATE FRENCH_CI_AS

可能不会成功。为什么这个?

如果table1为SQL_Latin1_General_CP1_CI_AS并且table2为FRENCH_CI_AS,则

2 / 一个人不能写...where table1.field1= table2.field2

数据库或表格中COLLATE的后果是什么?

3 个答案:

答案 0 :(得分:1)

您可以将项目与不同的排序规则进行比较。对于SQL Server,您使用:

table1.field1 = table2.field2 COLLATE FRENCH_CI_AS 

 table1.field1 = table2.field2 COLLATE SQL_Latin1_General_CP1_CI_AS

(或者无论field1整理是什么)。

注意:您应该尝试将排序规则作为服务器默认值,除非您有特殊原因要做其他事情。

答案 1 :(得分:1)

您可以将查询与整理名称进行比较

table1.field1 = table2.field2 COLLATE FRENCH_CI_AS 

否则改变列。(如果你想改变字段COLLATE)

ALTER TABLE [dbo].[TableName]
        ALTER COLUMN [FieldName] [DataType] COLLATE [Collate Name] NOT NULL

答案 2 :(得分:1)

这个答案基于使用Ms Sql Server的经验。我在使用其他数据库时只有一点经验,但我想其中很多也适用于它们。

来自Msdn(here):

  

Collat​​ions允许用户根据自己的字符串对字符串进行排序和比较   约定

Collat​​ions用于让sql server知道哪些字符被认为是相同的。如果使用不区分大小写的排序规则,则Xx被视为相同。如果使用区分大小写的排序规则,则它们是不同的。在重音不敏感的排序规则eé可能被认为是相同的,而在重音敏感的排序规则中它们是不同的。

至少对于Ms Sql Server,如果要比较存储在不同排序规则中的两个字符串,则必须使用其他答案中已提到的COLLATE子句告知服务器在比较中使用哪种排序规则。不确定如何在其他数据库中完成此操作。

如果您的表包含一行,其中包含一个包含文本ÖBc的列,并且您从此表中选择如下:

select COL from TBL where COL = 'obc'

然后使用像latin1_general_ci_ai这样的大小写和重音不敏感的排序规则找到该行。重音不敏感意味着OÖ是相同的,并且不区分大小写会解决案例不匹配问题。

使用相同的选择和归类latin1_general_cs_ai,由于区分大小写,将无法找到该行。

与排序规则latin1_general_ci_as类似,由于重音敏感度,将无法找到该行。

排序还用于在排序结果时确定按字母顺序排序。这将确定大小写字符的排序方式是否不同,以及重音字符的排序方式。