Eu tenho uma consulta SQL para criar o banco de dados 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, estou bastante confuso sobre a funcionalidade do COLLATE SQL_Latin1_General_CP1_CI_AS
.
Alguém pode me explicar isso? Além disso, gostaria de saber se a criação do banco de dados dessa maneira é uma prática recomendada?
sql-server
database
tsql
collation
Trovão
fonte
fonte
SQL_Latin1_General_CI_AS
. Especificamente, o CP1 me fez pensar.SQL_Latin1_General_CI_AS
. Pelo contrário, existe umLatin1_General_CI_AS
. VejaSELECT * FROM fn_helpcollations() where name IN ('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');
. Existem diferenças sutis em relação à classificação e comparação entre os dois agrupamentos. Consulte olcot.co.uk/sql-blogs/… .Esteja ciente de que a resposta aceita é um pouco incompleta. Sim, no nível mais básico, o agrupamento lida com a classificação. MAS, as regras de comparação definidas pelo agrupamento escolhido são usadas em muitos locais fora das consultas do usuário em relação aos dados do usuário.
Se "O que
COLLATE SQL_Latin1_General_CP1_CI_AS
faz?" significa "O que faz aCOLLATE
cláusula deCREATE DATABASE
fazer?", então:A
COLLATE {collation_name}
cláusula daCREATE DATABASE
instrução especifica o agrupamento padrão do banco de dados , e não o servidor; Os agrupamentos padrão no nível do banco de dados e no servidor controlam coisas diferentes.Controles de nível de servidor (ou seja, instância) :
master
,model
,msdb
, etempdb
.tempdb
, ele é o agrupamento padrão para colunas de sequência em tabelas temporárias (global e local), mas não variáveis da tabela.master
, é o agrupamento usado para dados no nível do servidor , como nomes de banco de dados (por exemplo,name
coluna emsys.databases
), nomes de logon etc.GOTO
etiquetasCOLLATE
cláusula está ausenteControles no nível do banco de dados :
CHAR
,VARCHAR
,NCHAR
,NVARCHAR
,TEXT
, eNTEXT
- mas não useTEXT
ouNTEXT
) quando aCOLLATE
cláusula está faltando a definição da coluna. Isso vale para as instruçõesCREATE TABLE
eALTER TABLE ... ADD
.'some text'
) e variáveis de sequência (ie@StringVariable
). Esse agrupamento só é usado ao comparar cadeias e variáveis com outras cadeias e variáveis. Ao comparar seqüências de caracteres / variáveis com colunas, o agrupamento da coluna será usado.sys.objects
), nomes de colunas (iesys.columns
), nomes de índice (iesys.indexes
), etc.Além disso:
Latin1
que não significa "ASCII" desde ASCII padrão cobre apenas os valores 0 - 127, e todas as páginas de código (que pode ser representado no SQL Server, e até mesmoNVARCHAR
) mapear esses mesmos 128 valores para os mesmos personagens.Se "O que
COLLATE SQL_Latin1_General_CP1_CI_AS
faz?" significa "O que esse agrupamento específico faz?", então:Como o nome começa
SQL_
, este é um agrupamento do SQL Server, não um agrupamento do Windows. Eles são definitivamente obsoletos, mesmo que não sejam oficialmente reprovados, e são principalmente para compatibilidade anterior ao SQL Server 2000. Embora, infelizmente,SQL_Latin1_General_CP1_CI_AS
seja muito comum, por ser o padrão na instalação em um sistema operacional usando o inglês dos EUA como idioma. Esses agrupamentos devem ser evitados, se possível.Os agrupamentos do Windows (aqueles com nomes que não começam
SQL_
) são mais novos, mais funcionais, têm uma classificação consistente entreVARCHAR
eNVARCHAR
para os mesmos valores e estão sendo atualizados com pesos de classificação adicionais / corrigidos e mapeamentos em maiúsculas / minúsculas. Esses agrupamentos também não apresentam o problema de desempenho potencial que os agrupamentos do SQL Server têm: Impacto nos índices ao misturar os tipos VARCHAR e NVARCHAR .Latin1_General
é a cultura / localidade.NCHAR
,NVARCHAR
eNTEXT
dados determina as regras linguísticas usados para classificação e comparação.CHAR
,VARCHAR
, eTEXT
de dados (colunas, literais, e variáveis), o que determina a:Latin1_General
agrupamentos usam a página de código 1252,Hebrew
agrupamentos usam a página de código 1255 e assim por diante.CP{code_page}
ou{version}
CP{code_page}
é a página de código de 8 bits que determina quais caracteres são mapeados para os valores de 128 a 255. Embora existam quatro páginas de código para DBCS (Conjuntos de Caracteres de Byte Duplo) que podem usar combinações de 2 bytes para criar mais de 256 caracteres, eles não estão disponíveis para os agrupamentos do SQL Server.Para agrupamentos do Windows :,
{version}
embora não esteja presente em todos os nomes de agrupamentos, refere-se à versão do SQL Server na qual o agrupamento foi introduzido (na maior parte). Os agrupamentos do Windows sem número de versão no nome são version80
(significando SQL Server 2000 como versão 8.0). Nem todas as versões do SQL Server vêm com novos agrupamentos, portanto, existem lacunas nos números de versão. Existem alguns que são90
(para o SQL Server 2005, que é a versão 9.0), a maioria são100
(para o SQL Server 2008, versão 10.0) e um conjunto pequeno possui140
(para o SQL Server 2017, versão 14.0).Eu disse "na maioria das vezes" porque os agrupamentos terminados em
_SC
foram introduzidos no SQL Server 2012 (versão 11.0), mas os dados subjacentes não eram novos, eles apenas adicionaram suporte a caracteres suplementares para as funções internas. Portanto, essas terminações existem para versão90
e100
agrupamentos, mas apenas começando no SQL Server 2012.CS
= diferencia maiúsculas de minúsculas ouCI
= não diferencia maiúsculas de minúsculasAS
= sensível ao acento ouAI
= insensível ao acentoKS
= Kana sensível ao tipo ou ausente = Kana insensível ao tipoWS
= sensível à largura ou ausente = insensível à larguraVSS
= sensível ao seletor de variação (disponível apenas nos agrupamentos da versão 140) ou ausente = insensível ao seletor de variaçãoÚltima peça opcional:
_SC
no final significa "suporte a caracteres complementares". O "suporte" afeta apenas como as funções internas interpretam pares substitutos (que são como caracteres suplementares são codificados em UTF-16). Sem_SC
no final (ou_140_
no meio), as funções internas não veem um único caractere suplementar, mas sim dois pontos de código sem sentido que compõem o par substituto. Essa finalização pode ser adicionada a qualquer agrupamento não-binário, versão 90 ou 100._BIN
ou_BIN2
no final significa classificação e comparação "binárias". Os dados ainda são armazenados da mesma forma, mas não há regras lingüísticas. Esse final nunca é combinado com nenhuma das cinco sensibilidades ou_SC
._BIN
é o estilo mais antigo e_BIN2
é o mais novo e mais preciso. Se estiver usando o SQL Server 2005 ou mais recente, use_BIN2
. Para obter detalhes sobre as diferenças entre_BIN
e_BIN2
, consulte: Diferenças entre as várias ordenações binárias (culturas, versões e BIN vs BIN2) ._UTF8
é uma nova opção a partir do SQL Server 2019. É uma codificação de 8 bits que permite que os dados Unicode sejam armazenadosVARCHAR
eCHAR
tipos de dados (mas não oTEXT
tipo de dados descontinuado ). Esta opção pode ser usada apenas em agrupamentos que suportam caracteres suplementares (por exemplo, agrupamentos da versão 90 ou 100 com_SC
seus nomes e agrupamentos da versão 140). Há também um_UTF8
agrupamento binário único (_BIN2
, não_BIN
).OBSERVAÇÃO: O UTF-8 foi projetado / criado para compatibilidade com ambientes / códigos configurados para codificações de 8 bits, mas que desejam oferecer suporte ao Unicode. Embora existam alguns cenários em que o UTF-8 pode oferecer até 50% de economia de espaço em comparação
NVARCHAR
, isso é um efeito colateral e tem um custo de um pequeno impacto no desempenho em muitas / a maioria das operações. Se você precisar disso para compatibilidade, o custo é aceitável. Se você quer isso para economizar espaço, é melhor testar e testar novamente. Os testes incluem todas as funcionalidades e mais do que apenas algumas linhas de dados. Esteja avisado de que os agrupamentos UTF-8 funcionam melhor quando TODAS as colunas e o próprio banco de dados estão usandoVARCHAR
dados (colunas, variáveis, literais de seqüência de caracteres) com um_UTF8
agrupamento. Esse é o estado natural para quem usa isso para fins de compatibilidade, mas não para quem espera usá-lo para economizar espaço. Tenha cuidado ao misturar dados do VARCHAR usando um_UTF8
agrupamento comVARCHAR
dados que não são_UTF8
agrupamentos ouNVARCHAR
dados, pois você pode experimentar um comportamento estranho / perda de dados. Para obter mais detalhes sobre os novos agrupamentos UTF-8, consulte: Suporte nativo a UTF-8 no SQL Server 2019: Salvador ou Falso Profeta?fonte
COLLATE
cláusulaCREATE DATABASE
faz. Você disse uma das várias coisas que faz. Por que você supõe que o OP quer apenas 10% da resposta? Se todas as informações forem apresentadas, cada pessoa poderá decidir quanto será necessário. Mas se apenas algumas informações forem fornecidas, a escolha foi feita para elas. Eu escolho fornecer o máximo de informações possível, porque a maior parte não é bem conhecida. (continuação)O CP1 significa 'Página de código 1' - tecnicamente, isso se traduz na página de código 1252
fonte
A palavra-chave COLLATE especifica que tipo de conjunto de caracteres e regras (ordem, regras de confronto) você está usando para os valores da sequência.
Por exemplo, no seu caso, você está usando regras latinas com maiúsculas e minúsculas ( CI ) e acento sensível ( AS )
Você pode consultar esta documentação
fonte
Isso especifica o agrupamento padrão para o banco de dados. Todo campo de texto que você criar nas tabelas do banco de dados usará esse agrupamento, a menos que você especifique outro.
Um banco de dados 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 Latin1 1, faz distinção entre maiúsculas e minúsculas (CI) e com acento sensível (AS). Esse agrupamento é usado nos EUA, portanto, conterá regras de classificação usadas nos EUA.
O agrupamento decide como os valores do texto são comparados em termos de igualdade e semelhança e como eles são comparados na classificação. A página de código é usada ao armazenar dados não unicode, por exemplo, campos varchar.
fonte
not
especificar um agrupamento, embora você pode aceitar o padrão) errada (ele é usado para dados unicode também)Latin1_General_CI_AS
. Agora eu li errado, porque eu meio que esperava que a declaração fosse sobre o agrupamento SERVER, o que requer aceitação do padrão na interface do usuário. Para o segundo ponto, você parece sugerir que o agrupamento não é usado para classificar dados unicode (mesmo que você alterne parasorting
parastoring
nas duas últimas frases). Os dados de texto Unicode também obedecem a agrupamentos.