SQL Server-Como resolver problemas relacionados a conflitos de Collation

9 03 2013

Excerto de um excelente artigo sobre collations no SQL Server.

 

Fonte: Blog Gustavo Maia Aguiar

 

Esse é um dos erros comuns quando trabalhamos com colunas textuais em operações de concatenação ou quando colunas textuais são utilizadas em operações de junção (JOINs) ou em combinação de resultados distintos (UNION). Nesse artigo descreverei porque isso acontece e alternativas para contornar ou resolver esse erro.

 

Um pouco sobre collation

Não sei se todos os que recebem essa mensagem sabem propriamente porque ela acontece e o que é o tal da collation. No fim das contas o que é importa é resolver o problema (mesmo sem saber exatamente qual era), mas penso que resolver o problema sabendo do que se trata é melhor do que resolvê-lo sem saber do que se trata. Assim sendo, farei uma breve descrição do que é collation.

 

Definir collation pode ser um pouco difícil, mas para tornar esse conceito simples, prefiro dizer que collation é a forma como tipos textuais serão armazenados, comparados e ordenados. A escolha da collation influenciará nesses três aspectos e a partir disso é que algumas facilidades podem ou não estar disponíveis. Uma collation que faça distinção entre maiúsculas e minúsculas considerará a letra "A" e a letra "a" como caractéres diferentes. Uma collation que faça distinção entre acentos também considerará a letra "Á" diferente da letra "A". Se a collation não faz distinção entre maiúsculas e minúsculas e nem acentos, então poderemos considerar que as letras "A", "a", "Á", "á", "À", "à", "Ã" e "ã" são equivalentes. Há um artigo muito bom publicado por Mauro Pichiliani explicando mais sobre collations. Recomendo que os interessados dêem uma lida. O artigo pode ser acessado através do link http://imasters.uol.com.br/artigo/262. Para aqueles que querem escovar bits e byte em torno desse assunto, o livro Inside SQL Server 2005 – The Storage Engine será de grande valia.

 

A escolha da collation tem alguns efeitos bem interessantes que merecem ser conhecidos para que você não seja surpreendido. Se você possuir uma collation que faça distinções entre acentos, ao fazer um pesquisa do tipo "Texto LIKE ‘%José%’", você poderá descobrir que os registros que tiverem o nome "Jose" não serão retornados, pois, não possuem acentos. O SQL Server armazena o nome das tabelas, views, procedures e functions em tabelas de sistema e toda vez que um objeto é chamado, uma pesquisa nessas tabelas de sistema é realizada. Se a collation do banco diferenciar maiúsculas de minúsculas, haverá uma diferença entre "SELECT * FROM Tabela" e "SELECT * FROM TABELA". Se há diferença, será necessário digitar o nome da tabela de forma idêntica ao nome criado (imagine quantas confusões não poderiam acontecer se a collation implementada diferenciar maiúsculas de minúsculas).

 

A collation possui uma hierarquia de três níveis. Podemos definí-la em nível de servidor, em nível de banco e em nível de coluna. A collation em nível de servidor é definida no momento da instalação e se errarmos poderá ser necessário reinstalar o SQL Server (há uma procedimento a respeito publicado por Nilton Pinheiro no site MCDBA Brasil e o mesmo está disponível através do link http://www.mcdbabrasil.com.br/modules.php?name=News&file=article&sid=244). As collations em nível de banco de dados e de coluna podem ser alteradas sem maiores impactos.

 

Toda vez que uma collation não é especificada, a collation do nível superior é escolhida. Dessa forma, se criarmos um banco de dados e não especificamos a collation, automaticamente a collation do servidor será escolhida para esse banco de dados, se criarmos uma tabela e nela houver colunas textuais sem especificação de collation, automaticamente a collation do banco de dados será atribuída para essas colunas.

 

 

 

Resolução definitiva

Uma vez que collations diferentes possam levar a conflitos no momento de combinar colunas textuais, a solução definitiva é trocar as collations utilizadas para uma única collation. Assim não haverá mais problemas em combinar colunas textuais. Essa parece ser uma solução adequada, mas alguns pontos merecem atenção antes de adotá-la.

 

Os bancos de dados possuem uma collation própria. Assim sendo, se você alterar a collation do servidor e restaurar o backup dos bancos de dados, as collations ficarão divergentes já que os bancos de dados continuaram a manter sua collation original. Isso pode parecer não representar problemas, mas lembre-se que o TempDB irá utilizar a collation do servidor. Se você criar tabelas temporárias, elas utilizarão a collation do servidor e se essa divergir da collation do banco os mesmos problemas apresentados podem ocorrer quando você combinar tabelas temporárias com as tabelas do banco (a menos que na criação das tabelas temporárias você especifique a mesma collation que a do banco ou as crie usando a instrução SELECT INTO).

 

As colunas possuem collation própria e caso você troque a collation do banco de dados através da instrução ALTER DATABASE, apenas as novas colunas irão obedecer a nova collation. As colunas antigas terão a collation original. Uma vez que a collation influencia a forma como os caractéres são armazenados, comparados e ordenados, trocar a collation do banco de dados não terá efeito sobre a collation das colunas existentes, pois, os dados já estão gravados.

 

Dados as considerações citadas, para conseguir unificar a collation é necessário garantir que a collation do servidor, do banco e das colunas sejam exatamente as mesmas. Dessa forma, novos bancos irão utilizar a collation do servidor e novas colunas irão utilizar a collation do banco e se a collation do banco for igual a collation do servidor, as novas colunas irão portanto utilizar a collation do servidor. Trocar a collation do banco é bastante simples (basta o comando ALTER DATABASE). Trocar a collation do servidor também é simples (a dificuldade pode ser em conseguir uma janela para indisponbilizar o SQL Server). O grande problema está em trocar a collation das colunas já existentes que não serão alteradas automaticamente.


Ações

Information

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s




%d bloggers like this: