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 知道哪些字符被认为是相同的。如果使用不区分大小写的排序规则,X
和 x
被认为是相同的。如果使用区分大小写的排序规则,它们是不同的。在不区分重音的排序规则中,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 中使用的默认存储引擎是啥,如果我更改默认存储引擎,我的数据库或表会受到影响吗?