COLLATE 在数据库或表中的结果是啥[重复]

Posted

技术标签:

【中文标题】COLLATE 在数据库或表中的结果是啥[重复]【英文标题】:What is the consequence of COLLATE in a database or table [duplicate]COLLATE 在数据库或表中的结果是什么[重复] 【发布时间】:2014-07-11 04:13:47 【问题描述】:

1/有时你会写

     ALTER DATABASE [MyDb] COLLATE SQL_Latin1_General_CP1_CI_AS

过了一会儿,如果你尝试

     ALTER DATABASE [MyDb] COLLATE FRENCH_CI_AS

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

2/ 如果 table1 是 SQL_Latin1_General_CP1_CI_AS 并且如果 table2 是 FRENCH_CI_AS 不能写...where table1.field1= table2.field2

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

【问题讨论】:

1:statemnt 可能会因为数据库被其他人使用而失败,此时您不能发出ALTER DATABASE 语句。首先尝试将其设置为单用户模式。 2:SQL Server 从这里开始:msdn.microsoft.com/en-us/library/ms143726.aspx 【参考方案1】:

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

table1.field1 = table2.field2 COLLATE FRENCH_CI_AS 

否则更改列。(如果您想更改字段 COLLATE)

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

【讨论】:

【参考方案2】:

此答案基于与 Ms Sql Server 合作的经验。我在使用其他数据库方面只有一点经验,但我想其中大部分也适用于它们。

来自 Msdn (here):

排序规则让用户可以根据自己的方式对字符串进行排序和比较 约定

排序规则用于让 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 类似,由于重音敏感,将找不到该行。

排序规则还用于确定排序结果时的字母排序顺序。这决定了大写和小写字符的排序方式是否不同,以及重音字符的排序位置。

【讨论】:

【参考方案3】:

您可以比较具有不同排序规则的项目。对于您使用的 SQL Server:

table1.field1 = table2.field2 COLLATE FRENCH_CI_AS 

 table1.field1 = table2.field2 COLLATE SQL_Latin1_General_CP1_CI_AS

(或任何 field1 排序规则)。

注意:您应该尝试将排序规则保留为服务器默认值,除非您有特定的理由不这样做。

【讨论】:

以上是关于COLLATE 在数据库或表中的结果是啥[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将结果存储到变量或表中,以后我可以使用它

phpmyadmin 中使用的默认存储引擎是啥,如果我更改默认存储引擎,我的数据库或表会受到影响吗?

linux MySQL 如何复制表数据或表结构到新表中

在不使用第三个变量或表的情况下交换表中两列的值

从sql列中拆分数据并将其保存在sql存储过程中的另一个表中的最有效方法是啥[重复]

MySQL如何指定字符集和排序规则?