O que ‘COLLATE SQL_Latin1_General_CP1_CI_AS’ faz?

Eu tenho uma consulta SQL para criar o database no SQLServer conforme indicado abaixo:

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 

Corre bem.

Enquanto o resto do SQL é claro para ser estou bastante confuso sobre a funcionalidade de COLLATE SQL_Latin1_General_CP1_CI_AS .

Alguém pode explicar isso para mim? Além disso, gostaria de saber se criar o database dessa maneira é uma prática recomendada?

Define como o servidor de database é classificado. nesse caso:

 SQL_Latin1_General_CP1_CI_AS 

se divide em partes interessantes:

  1. latin1 faz o servidor tratar strings usando charset latin 1, basicamente ascii
  2. CP1 significa página de código 1252
  3. Comparações insensíveis a casos de CI modo que ‘ABC’ seria igual a ‘abc’
  4. AS sotaque sensível, então ‘ü’ não é igual a ‘u’

PS Para informações mais detalhadas, não deixe de ler a resposta de @ solomon-rutzky .

O CP1 significa ‘Página de código 1’ – tecnicamente isso se traduz na página de código 1252

Por favor, esteja ciente de que a resposta aceita é um pouco incompleta. Sim, no nível mais básico, o Collation trata da sorting. MAS, as regras de comparação definidas pelo agrupamento escolhido são usadas em muitos lugares fora das consultas do usuário em relação aos dados do usuário.

A cláusula COLLATE {collation_name} da instrução CREATE DATABASE especifica o COLLATE {collation_name} padrão do banco de dados , e não o servidor; Os agrupamentos padrão no nível do database e no nível do servidor controlam coisas diferentes.

Controles de nível do servidor (ou seja, instância) :

  • Agrupamento em nível de database para bancos de dados do sistema: master , model , msdb e tempdb .
  • Devido ao controle do agrupamento de tempdb nível de database, ele é o agrupamento padrão para colunas de seqüência de caracteres em tabelas temporárias (global e local), mas não em variables ​​de tabela.
  • Devido ao controle do agrupamento de nível de database do master , ele é o agrupamento usado para dados no nível do servidor , como nomes de database (ou seja, coluna de name em sys.databases ), nomes de login etc.
  • Manipulação de nomes de parâmetros / variables
  • Manipulação de nomes de cursor
  • Manipulação de labels GOTO
  • Agrupamento padrão usado para bancos de dados recém-criados quando a cláusula COLLATE está ausente

Controles no nível de database :

  • Agrupamento padrão usado para colunas de cadeias recém-criadas ( CHAR , VARCHAR , NCHAR , NVARCHAR , TEXT e NTEXT – mas não usam TEXT ou NTEXT ) quando a cláusula COLLATE está ausente da definição da coluna. Isso vale para as CREATE TABLE e ALTER TABLE ... ADD .
  • Agrupamento padrão usado para literais de string (ou seja, 'some text' ) e variables ​​de string (ou seja, @StringVariable ). Este agrupamento é usado apenas quando se comparam strings e variables ​​com outras strings e variables. Ao comparar strings / variables ​​com colunas, o agrupamento da coluna será usado.
  • O agrupamento usado para metadados de nível de banco de dados, como nomes de object (ou seja, sys.objects ), nomes de coluna (ou seja, sys.columns ), nomes de índice (ou seja, sys.indexes ) etc.
  • O agrupamento usado para objects no nível do database : tabelas, colunas, índices etc.

Além disso:

  • Os SQL_ começam com SQL_ são os SQL_ específicos do SQL Server antigos (e definitivamente obsoletos, mesmo que não oficialmente preteridos) (criados antes de o SQL Server poder fazer uso de agrupamentos no nível do sistema operacional).
  • Todos os outros Collations são Windows Collations e devem ser os que estão sendo usados.
  • ASCII é uma codificação de 8 bits (para uso comum; tecnicamente “ASCII” é de 7 bits com caracteres de 0 a 127 e “Extended ASCII” é de 8 bits com caracteres de 0 a 255)
  • Latin1 refere-se à cultura / localidade que determina:
    • Página de código para dados CHAR , VARCHAR e TEXT (colunas, literais e variables). A página de código é a parte “estendida” do ASCII estendido e controla quais caracteres são usados ​​para valores de 128 a 255.
    • As regras pelas quais os caracteres são classificados e comparados. Isso abrange os dados VARCHAR e NVARCHAR (isto é, Unicode).

A palavra-chave COLLATE especifica o tipo de conjunto de caracteres e regras (ordem, regras de confrontação) que você está usando para valores de string.

Por exemplo, no seu caso, você está usando regras latinas com insensibilidade a maiúsculas e minúsculas ( CI ) e sensível ao sotaque ( AS )

Você pode consultar esta documentação

Isso especifica o agrupamento padrão para o database. Cada campo de texto criado em tabelas no database usará esse agrupamento, a menos que você especifique um diferente.

Um database sempre tem um agrupamento padrão. Se você não especificar nenhum, o agrupamento padrão da instância do SQL Server será usado.

O nome do agrupamento que você usa mostra que ele usa a página de códigos 1 do Latin1, é insensível a maiúsculas e minúsculas (CI) e sensível ao acentuação (AS). Esse agrupamento é usado nos EUA, portanto, ele conterá regras de sorting usadas nos EUA.

O agrupamento decide como os valores de texto são comparados por igualdade e semelhança e como eles são comparados ao classificar. A página de códigos é usada ao armazenar dados não-unicode, por exemplo, campos varchar.

    Intereting Posts