“COLLATE SQL_Latin1_General_CP1_CI_AS”是做什么的?
我有一个SQL查询来创buildSQLServer中的数据库,如下所示:
create database yourdb on ( name = 'yourdb_dat', filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdbdat.mdf', size = 25mb, maxsize = 1500mb, filegrowth = 10mb ) log on ( name = 'yourdb_log', filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdblog.ldf', size = 7mb, maxsize = 375mb, filegrowth = 10mb ) COLLATE SQL_Latin1_General_CP1_CI_AS; go
它运行良好。
虽然其余的SQL很清楚,但我对COLLATE SQL_Latin1_General_CP1_CI_AS
的function非常困惑。
任何人都可以向我解释这个? 另外,我想知道以这种方式创build数据库是否是最佳做法?
它设置数据库服务器的sorting方式。 在这种情况下:
SQL_Latin1_General_CP1_CI_AS
分解成有趣的部分:
-
latin1
使服务器对待string使用字符集latin 1,基本上ascii -
CP1
代表代码页1252 -
CI
不区分大小写比较所以'ABC'将等于'abc' -
AS
重音敏感,所以'ü'不等于'你'
PS更多详情请务必阅读@ solomon-rutzky的回答 。
CP1的意思是“代码页1” – 从技术上讲,这转换成代码页1252
COLLATE关键字指定用于string值的字符集和规则(顺序,对抗规则)的types。
例如,在你的情况下,你正在使用拉丁语规则,不区分大小写( CI )和区分重音( AS )
你可以参考这个文档
请注意,接受的答案有点不完整。 是的,在最基本的级别整理处理sorting。 但是,所select的sorting规则所定义的比较规则在针对用户数据的用户查询之外的许多地方被使用。
CREATE DATABASE
语句的COLLATE {collation_name}
子句指定CREATE DATABASE
的默认sorting规则,而不是服务器; 数据库级别和服务器级别的默认sorting规则控制不同的事情。
服务器(即实例)级控件:
- 系统数据库的数据库级别整理:
master
,model
,msdb
和tempdb
。 - 由于控制了
tempdb
的数据库级别sorting规则,因此它是临时表(全局和本地)中string列的默认sorting规则,而不是表variables。 - 由于控制了
master
级别的数据库级别,因此它是用于服务器级别数据(如数据库名称(即sys.databases
name
列),login名称等)的Collation。 - 处理参数/variables名称
- 处理游标名称
- 处理
GOTO
标签 - 缺less
COLLATE
子句时用于新build数据库的默认sorting规则
数据库级别的控制:
- 当列定义中缺less
COLLATE
子句时,用于新创build的string列(CHAR
,VARCHAR
,NCHAR
,NVARCHAR
,TEXT
和NTEXT
– 但不使用TEXT
或NTEXT
)的默认sorting规则。 这适用于CREATE TABLE
和ALTER TABLE ... ADD
语句。 - 用于string文本(即
'some text'
)和stringvariables(即@StringVariable
)的默认sorting规则。 此sorting规则仅用于将string和variables与其他string和variables进行比较。 将string/variables与列进行比较时,将使用列的归类。 - 用于数据库级元数据(如对象名称(即
sys.objects
),列名称(即sys.columns
),索引名称(即sys.indexes
)等)的sys.indexes
- 用于数据库级对象的整理:表,列,索引等
也:
- 从
SQL_
开始的sorting规则是旧的(并且绝对过时,即使没有正式弃用)SQL Server特定sorting规则(在SQL Server能够使用操作系统级sorting规则之前创build)。 - 所有其他的sorting规则是Windows的sorting规则,应该是正在使用的。
- ASCII是一个8位的编码(通常使用;从技术上讲,“ASCII”是7位,字符是0-127,“扩展ASCII”是8位,字符是0-255)
-
Latin1
指的是确定的文化/语言环境:-
CHAR
,VARCHAR
和TEXT
数据的代码页(列,文字和variables)。 代码页是扩展ASCII的“扩展”部分,并控制哪些字符用于值128-255。 - 字符sorting和比较的规则。 这包括
VARCHAR
和NVARCHAR
(即Unicode)数据。
-
这指定了数据库的默认sorting规则。 在数据库的表中创build的每个文本字段都将使用该sorting规则,除非您指定了另一个sorting规则。
数据库始终具有默认的sorting规则。 如果不指定,则使用SQL Server实例的默认sorting规则。
您使用的sorting规则的名称显示它使用Latin1代码页1,不区分大小写(CI)和区分重音(AS)。 这种整理在美国使用,所以它将包含在美国使用的sorting规则。
sorting规则决定文本值如何进行比较以获得平等和相似度,以及如何在sorting时比较文本值。 存储非Unicode数据时使用代码页,例如varchar字段。