Estamos mudando do SQL 2005 [Instância e banco de dados têm agrupamento de SQL_Latin1_General_CP1_CI_AS
] para o SQL 2008 [cujo padrão é Latin1_General_CI_AS
].
Concluí uma instalação do SQL 2008 R2 e usei o padrão Latin1_General_CI_AS
agrupamento , com a restauração do banco de dados ainda ativada SQL_Latin1_General_CP1_CI_AS
. Os problemas excluídos ocorreram - as tabelas #temp em Latin1_General_CI_AS
que o banco de dados estava SQL_Latin1_General_CP1_CI_AS
e é aqui que estou agora - preciso de conselhos sobre as armadilhas agora, por favor.
Na instalação do SQL 2008 R2, tenho a opção na instalação para usar 'SQL Collation, used for backwards compatibility'
onde eu tenho a opção de selecionar o mesmo agrupamento como o banco de dados de 2005: SQL_Latin1_General_CP1_CI_AS
.
Isso me permitirá não ter problemas com as #temp tables, mas existem armadilhas?
Perderia qualquer funcionalidade ou recurso de qualquer tipo ao não usar um agrupamento "atual" do SQL 2008?
- E quando mudamos (por exemplo, em 2 anos) de 2008 para o SQL 2012? Terei problemas então?
Em algum momento eu seria forçado a ir para
Latin1_General_CI_AS
?Li que alguns scripts do DBA concluem as linhas de bancos de dados completos e, em seguida, executam o script de inserção no banco de dados com o novo agrupamento - estou com muito medo e desconfiado disso - você recomendaria fazer isso?
fonte
Respostas:
Antes de tudo, peço desculpas por uma resposta tão longa, pois sinto que ainda há muita confusão quando as pessoas falam sobre termos como agrupamento, ordem de classificação, página de código etc.
De BOL :
Isso significa que o agrupamento é muito importante, pois especifica regras sobre como as seqüências de caracteres dos dados são classificadas e comparadas.
Nota: Mais informações sobre COLLATIONPROPERTY
Agora vamos primeiro entender as diferenças ......
Executando abaixo do T-SQL:
Os resultados seriam:
Olhando para os resultados acima, a única diferença é a ordem de classificação entre os dois agrupamentos. Mas isso não é verdade, e você pode ver o motivo:
Teste 1:
Resultados do Teste 1:
A partir dos resultados acima, podemos ver que, se não podemos comparar diretamente valores em colunas com diferentes agrupamentos, você deve usar
COLLATE
para comparar os valores da coluna.TESTE 2:
A principal diferença é o desempenho, como Erland Sommarskog aponta nesta discussão no msdn .
--- Crie índices nas duas tabelas
--- Execute as consultas
--- Isso terá conversão IMPLICIT
--- Execute as consultas
--- Isso NÃO terá conversão IMPLICIT
A razão para a conversão implícita é porque, eu tenho meu banco de dados e servidor de agrupamento tanto como
SQL_Latin1_General_CP1_CI_AS
ea tabela Table_Latin1_General_CI_AS tem coluna Comentários definidos comoVARCHAR(50)
com COLLATE Latin1_General_CI_AS , por isso durante a pesquisa SQL Server tem que fazer uma conversão implícita.Teste 3:
Com a mesma configuração, agora compararemos as colunas varchar com os valores nvarchar para ver as alterações nos planos de execução.
- execute a consulta
- execute a consulta
Observe que a primeira consulta é capaz de fazer a busca de índice, mas precisa fazer a conversão implícita, enquanto a segunda realiza uma varredura de índice que se mostra ineficiente em termos de desempenho, quando varre tabelas grandes.
Conclusão:
SQL_Latin1_General_CP1_CI_AS
é um agrupamento SQL com as regras que permitem classificar dados para unicode e não unicode são diferentes.Latin1_General_CI_AS
é um agrupamento do Windows com as regras que permitem classificar dados para unicode e não unicode.Veja minha resposta acima.
Tudo depende de quais funcionalidades / recursos você está se referindo. Agrupar é armazenar e classificar dados.
Não posso garantir! Como as coisas podem mudar e é sempre bom estar alinhado com a sugestão da Microsoft +, você precisa entender seus dados e as armadilhas que mencionei acima. Consulte também este e este itens de conexão.
Quando você deseja alterar o agrupamento, esses scripts são úteis. Eu me encontrei alterando o agrupamento de bancos de dados para coincidir com o agrupamento do servidor muitas vezes e eu tenho alguns scripts que o fazem muito bem. Deixe-me saber se você precisar.
Referências :
fonte
Além do que o @Kin detalhou em sua resposta , há mais algumas coisas a serem lembradas ao alternar o agrupamento padrão do servidor (ou seja, da instância) (itens acima da linha horizontal são diretamente relevantes para os dois agrupamentos mencionados na pergunta; itens abaixo da linha horizontal são relevantes para o geral):
Se Agrupamento padrão do seu banco de dados NÃO MUDAR, então o problema "implícita conversão" desempenho descrito na resposta da @ Kin deve não ser um problema, já que strings literais e variáveis locais utilizar agrupamento padrão do banco de dados, não o servidor do. Os únicos impactos para o cenário em que o agrupamento no nível da instância é alterado, mas não o agrupamento no nível do banco de dados são (ambos descritos em detalhes abaixo):
Uma diferença entre esses dois agrupamentos está em como eles classificam certos caracteres para
VARCHAR
dados (isso não afeta osNVARCHAR
dados). Os agrupamentos não EBCDICSQL_
usam o que é chamado "Classificação por Cadeia" paraVARCHAR
dados, enquanto todos os outros agrupamentos e até mesmo osNVARCHAR
dados para os agrupamentos não EBCDICSQL_
usam o que é chamado "Classificação por Palavra". A diferença é que, em "Classificação da palavra", o traço-
e o apóstrofo'
(e talvez alguns outros caracteres?) Recebem um peso muito baixo e são essencialmente ignorados, a menos que não haja outras diferenças nas strings. Para ver esse comportamento em ação, execute o seguinte:Devoluções:
e:
Embora você "perca" o comportamento "Classificação da cadeia", não tenho certeza se chamaria isso de "recurso". É um comportamento que é considerado indesejável (como evidenciado pelo fato de não ter sido antecipado em nenhum dos agrupamentos do Windows). No entanto, é uma diferença definida de comportamento entre os dois agrupamentos (novamente, apenas para
VARCHAR
dados não EBCDIC ), e você pode ter código e / ou expectativas do cliente com base no comportamento "Classificação da cadeia". Isso requer testar seu código e possivelmente pesquisar para ver se essa mudança de comportamento pode ter algum impacto negativo nos usuários.Outra diferença entre
SQL_Latin1_General_CP1_CI_AS
eLatin1_General_100_CI_AS
é a capacidade de fazer expansões nosVARCHAR
dados (osNVARCHAR
dados já podem fazer isso na maioria dosSQL_
agrupamentos), como lidar comæ
como se fosseae
:Devoluções:
A única coisa que você está "perdendo" aqui é não conseguir fazer essas expansões. De um modo geral, esse é outro benefício de mudar para um agrupamento do Windows. No entanto, assim como no movimento "Classificação da string" para "Classificação da palavra", o mesmo cuidado se aplica: é uma diferença definida de comportamento entre os dois agrupamentos (novamente, apenas para
VARCHAR
dados), e você pode ter código e / ou cliente expectativas baseadas em não ter esses mapeamentos. Isso requer testar seu código e possivelmente pesquisar para ver se essa mudança de comportamento pode ter algum impacto negativo nos usuários.(observado pela primeira vez nesta resposta do SO por @Zarepheth: O SQL Server SQL_Latin1_General_CP1_CI_AS pode ser convertido com segurança em Latin1_General_CI_AS? )
O agrupamento no nível do servidor é usado para definir o agrupamento dos bancos de dados do sistema, o que inclui
[model]
. O[model]
banco de dados é usado como um modelo para criar novos bancos de dados, que inclui[tempdb]
cada inicialização do servidor. Mas, mesmo com uma alteração no agrupamento no nível do servidor alterando o agrupamento[tempdb]
, existe uma maneira fácil de corrigir diferenças de agrupamento entre o banco de dados que é "atual" quandoCREATE #TempTable
é executado e[tempdb]
. Ao criar tabelas temporárias, declare um agrupamento usando aCOLLATE
cláusula e especifique um agrupamento deDATABASE_DEFAULT
:É melhor usar a versão mais recente do agrupamento desejado, se houver várias versões disponíveis. A partir do SQL Server 2005, uma série de agrupamentos "90" foi introduzida e o SQL Server 2008 introduziu uma série de agrupamentos "100". Você pode encontrar esses agrupamentos usando as seguintes consultas:
Como você está no SQL Server 2008 R2, use em
Latin1_General_100_CI_AS
vez deLatin1_General_CI_AS
.Uma diferença entre as versões com diferenciação de maiúsculas e minúsculas desses agrupamentos específicos (ie
SQL_Latin1_General_CP1_CS_AS
eLatin1_General_100_CS_AS
) está na ordem das letras maiúsculas e minúsculas ao fazer a classificação com distinção entre maiúsculas e minúsculas. Isso também afeta os intervalos de classe de caractere único (ou seja[start-end]
) que podem ser usados com oLIKE
operador e aPATINDEX
função. As três consultas a seguir mostram esse efeito para a classificação e o intervalo de caracteres .:A única maneira de ordenar maiúsculas antes de minúsculas (para a mesma letra) é usar um dos 31 agrupamentos que suportam esse comportamento, que são os
Hungarian_Technical_*
agrupamentos e um punhado deSQL_
agrupamentos (que apenas suportam esse comportamento paraVARCHAR
dados )Menos importante para essa alteração específica, mas ainda é bom saber, já que seria impactante se alterar o servidor para um agrupamento binário ou com distinção entre maiúsculas e minúsculas, é que o agrupamento no nível do servidor também afeta:
sysname
tipo de dadosOu seja, se você ou "o programador que saiu recentemente", aparentemente responsável por todo o código incorreto ;-), não tiver cuidado com o caso e declarar uma variável como,
@SomethingID
mas depois se referir a ela mais@somethingId
tarde, isso será interrompido se você mudar para um caso agrupamento sensível ou binário. Da mesma forma, o código que utiliza osysname
tipo de dados, mas refere-se a ela comoSYSNAME
,SysName
ou algo diferente de todos minúscula também vai quebrar se moveu para uma instância usando um agrupamento caso-sensível ou binário.fonte