'COLLATE SQL_Latin1_General_CP1_CI_AS'有什么作用?

Thu*_*der 122 t-sql database sql-server collation

我有一个SQL查询来在SQLServer中创建数据库,如下所示:

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
Run Code Online (Sandbox Code Playgroud)

它运行正常.

虽然SQL的其余部分很清楚,但我对它的功能非常困惑COLLATE SQL_Latin1_General_CP1_CI_AS.

任何人都可以向我解释这个吗?另外,我想知道以这种方式创建数据库是否是最佳做法?

Kri*_*ris 230

它设置数据库服务器的排序方式.在这种情况下:

SQL_Latin1_General_CP1_CI_AS
Run Code Online (Sandbox Code Playgroud)

分成有趣的部分:

  1. latin1 使服务器使用charset latin 1处理字符串,基本上是ascii
  2. CP1 代表代码页1252
  3. CI 不区分大小写的比较所以'ABC'将等于'abc'
  4. AS 重音敏感,所以'ü'不等于'你'

PS有关更多详细信息,请务必阅读@ solomon-rutzky的答案.

  • 这和`SQL_Latin1_General_CI_AS`有什么区别.具体来说,**CP1**让我感到疑惑. (11认同)
  • @Kad:似乎没有`SQL_Latin1_General_CI_AS`.相反,有一个`Latin1_General_CI_AS`.请参阅`SELECT*FROM fn_helpcollat​​ions(),其中名称为IN('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');`.关于两种排序规则之间的排序和比较存在细微差别.请参阅http://www.olcot.co.uk/sql-blogs/revised-difference-between-collat​​ion-sql_latin1_general_cp1_ci_as-and-latin1_general_ci_as. (7认同)
  • @Kad:CP1代表代码页1252.代码页是一个查找表,用于将十六进制值映射到字符集中的特定字符.CP1是Microsoft亚文化中CP1252的简写.Windows是唯一一个本地使用CP1252的平台,因为它是DOS天的保留.虽然它与ISO 8859-1非常相似,但它们并不相同.映射字符有差异,例如欧元和其他一些不在ISO 8859-1中的字符. (4认同)

Sol*_*zky 59

请注意,接受的答案有点不完整.是的,在最基本的级别Collat​​ion处理排序.但是,所选择的排序规则定义的比较规则在用户查询之外的许多地方用于用户数据.

该语句的COLLATE SQL_Latin1_General_CP1_CI_AS子句COLLATE指定数据库的默认排序规则,而不是服务器; 数据库级和服务器级默认Collat​​ions控制不同的东西.

服务器(即实例) - 级别控件:

  • 系统数据库的数据库级排序规则:CREATE DATABASE,COLLATE {collation_name},CREATE DATABASE,和master.
  • 由于控制了DB级Collat​​ion model,因此它是临时表(全局和本地)中字符串列的默认排序规则,而不是表变量.
  • 由于控制了DB级Collat​​ion msdb,因此用于服务器级数据的Collat​​ion ,例如数据库名称(即tempdb列入tempdb),登录名称等.
  • 处理参数/变量名称
  • 处理游标名称
  • 处理master标签
  • name缺少子句时,用于新创建的数据库的默认排序规则

数据库级控件:

  • 使用的默认排序规则为新创建的字符串列(sys.databases,GOTO,COLLATE,CHAR,VARCHAR,和NCHAR-但不要使用NVARCHARTEXT)当NTEXT从句从列定义丢失.这适用于两者TEXTNTEXT陈述.
  • 用于字符串文字(即COLLATE)和字符串变量(即CREATE TABLE)的默认排序规则.只有在将字符串和变量与其他字符串和变量进行比较时才会使用此排序规则.将字符串/变量与列进行比较时,将使用列的排序规则.
  • 用于数据库级元数据的排序规则,例如对象名称(即ALTER TABLE ... ADD),列名称(即'some text'),索引名称(即@StringVariable)等.
  • 用于数据库级对象的排序规则:表,列,索引等.

也:

  • 从一开始的排序sys.objects是旧的(并且肯定是过时的,即使没有正式弃用)SQL Server特定的排序规则(在SQL Server能够使用OS级排序规则之前创建).
  • 所有其他排序规则都是Windows排序规则,应该是正在使用的排序规则.
  • ASCII是一种8位编码(对于常见用途;技术上"ASCII"是7位,字符0 - 127,"扩展ASCII"是8位,字符0 - 255)
  • sys.columns 指的是确定以下内容的文化/区域设置:
    • 代码页sys.indexes,Latin1NVARCHAR数据(列,文本和变量).代码页是扩展ASCII的"扩展"部分,并控制哪些字符用于值128 - 255.
    • 字符排序和比较的规则.这包括COLLATE SQL_Latin1_General_CP1_CI_ASSQL_(即Unicode)数据.

  • @Kris我有一段时间意思说"谢谢!" 表现出这样的成熟和专业.我有点习惯于那些冒犯别人的人说他们错了,然后变得"难"(甚至更难)与之互动.但是,你对我的反应,"接受的答案是***错误的***"激励我调低我的介绍,并应该在这里作为一个例子,如何正确和富有成效地沟通. (6认同)
  • 虽然我支持这么多信息和努力,但我的回答绝对没错(数据库存储数据,数据库服务器对此数据起作用,排序正在起作用).我选择简洁而不是完整的数学精度,因为OP可能正在寻找足够的,而不是所有可能的信息. (4认同)
  • 我想我明白你的意思但我的目的是提供足够的信息而不是太多.对于很多人来说,太多的信息很快变得太复杂了.当我没有为任何情况提供足够的信息时,我会期待后续问题.(我也没想到会对这个话题给予太多关注) (4认同)
  • 嗨@Kris.谢谢.公平地说,我没有说你的答案是完全错误的,只是非常不完整.我已经更新,希望澄清这一点.我得到了你所说的,但是OP询问了`CREATE DATABASE`的`COLLATE`条款是做什么的.你说过它做的几件事之一.为什么你认为OP只想知道10%的答案?如果显示所有信息,则每个人可以决定需要多少信息.但是如果只给出了一些信息,那么他们就会做出选择.我选择提供尽可能多的信息,因为大部分信息都不为人所知.(继续) (2认同)
  • 在Collat​​ions(和编码)中,大部分内容都是不完整或不正确的.因此,大多数人在不了解或认为他们知道某些事情但完全错误的情况下走开了.当人们拥有所有信息时,他们会做出更好的决策,所以我觉得最好尽可能提供完整的答案.通过选择简洁性,可能会使读者在具有区分大小写或二进制排序规则的DB中出现解析错误等时感到困惑,因为未提及名称解析.因此,虽然你对排序是正确的,但我觉得这本身就是误导. (2认同)
  • 你很高兴听到我以某种方式产生了积极的影响,但我喜欢"错误",它开辟了学习新事物的机会,这太棒了! (2认同)

Chr*_*row 23

CP1表示"代码页1" - 从技术上讲,这转换为代码页1252


il_*_*uru 15

COLLATE关键字指定要使用什么样的字符集和规则(秩序,对抗规则)的字符串值.

例如,在您的情况下,您使用不区分大小写(CI)和重音敏感(AS)的拉丁规则

您可以参考本文档


Guf*_*ffa 8

这指定了数据库的默认排序规则.您在数据库中的表中创建的每个文本字段都将使用该排序规则,除非您指定另一个排序规则.

数据库始终具有默认排序规则.如果未指定any,则使用SQL Server实例的默认排序规则.

您使用的排序规则的名称显示它使用Latin1代码页1,不区分大小写(CI)和重音敏感(AS).此排序规则在美国使用,因此它将包含在美国使用的排序规则.

排序规则决定如何比较文本值的相等性和相似性,以及在排序时如何比较它们.存储非unicode数据时使用代码页,例如varchar字段.