SQL Server na prática

Resolver conflitos de collation no SQL Server sem mudar dados

Diagnostique collations de colunas, bases e tempdb preservando comparações, chaves únicas e acesso eficiente pelos índices existentes.

Uma junção pode funcionar em uma instância SQL Server e falhar após restaurar a base em outra porque os textos comparados possuem collations diferentes. Adicionar COLLATE até o erro sumir pode restaurar a execução e alterar quais linhas correspondem. Maiúsculas, acentos e ordem de classificação fazem parte do contrato dos dados.

Comece pelo significado do identificador. Os códigos abc e ABC representam o mesmo cliente? Uma busca por nome deve ignorar acentos e ainda preservar a grafia apresentada? O conflito técnico depende dessas decisões de negócio.

Inspecionar os níveis envolvidos

As configurações do servidor, da base e de cada coluna não são intercambiáveis.

SELECT SERVERPROPERTY('Collation') AS ServerCollation,
       DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS DatabaseCollation,
       DATABASEPROPERTYEX(N'tempdb', 'Collation') AS TempdbCollation;

SELECT name AS ColumnName, collation_name
FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.Customers')
  AND collation_name IS NOT NULL;

Substitua dbo.Customers pela tabela afetada. Colunas individuais podem usar uma collation diferente do padrão da base. Uma base restaurada mantém suas configurações, enquanto colunas temporárias comuns frequentemente herdam o padrão do tempdb em instalações convencionais. Isso explica falhas que aparecem somente depois da mudança de servidor.

Tipos Unicode não eliminam regras de collation. nvarchar altera a representação dos caracteres, mas comparações continuam dependendo dessas regras. O exemplo demonstra a diferença.

SELECT
 CASE WHEN N'Cafe' COLLATE Latin1_General_100_CI_AI = N'café'
      THEN 1 ELSE 0 END AS InsensitiveMatch,
 CASE WHEN N'Cafe' COLLATE Latin1_General_100_CS_AS = N'café'
      THEN 1 ELSE 0 END AS SensitiveMatch;

InsensitiveMatch retorna 1 e SensitiveMatch retorna 0. A primeira comparação ignora maiúsculas e acentos; a segunda distingue ambos. Nenhuma é universalmente correta. Uma pesquisa de produtos e uma restrição de unicidade podem exigir políticas distintas.

Use literais Unicode e parâmetros com tipos corretos para entradas multilíngues. Um COLLATE posterior não recupera caracteres perdidos ao passar por uma página de códigos incompatível. Corrija primeiro a ingestão e a definição dos parâmetros.

Alinhar a etapa intermediária

Quando a coluna permanente usa o padrão da base atual, a coluna temporária pode adotá-lo explicitamente.

-- Suitable when the target column uses the current database default.
CREATE TABLE #Incoming (
    CustomerCode nvarchar(50) COLLATE DATABASE_DEFAULT NOT NULL
);
CREATE INDEX IX_Incoming_Code ON #Incoming(CustomerCode);

Isso evita herdar um padrão diferente do tempdb por acidente. Não é uma solução universal: se a coluna de destino tem collation explícita própria, a temporária deve acompanhar essa regra real. Confira também o contexto da base no momento da criação.

Para uma consulta ocasional entre bases, COLLATE em uma expressão pode ser adequado. Escolha a regra conscientemente e examine o plano real. Aplicar outra collation a uma coluna grande e indexada pode exigir conversão e prejudicar o aproveitamento da ordenação existente. Alinhar e indexar uma entrada intermediária menor pode criar uma fronteira repetível melhor.

Envolver todas as comparações em LOWER ou UPPER não substitui essa decisão. Isso pode acrescentar cálculo por linha, dificultar índices e ainda não representar corretamente acentos e idioma. Se o projeto precisa de chaves normalizadas, produza-as sob uma regra explícita e consistente.

Tratar a troca como migração

Alterar o padrão da base não muda automaticamente a collation das colunas existentes. Uma migração real deve inventariar colunas, índices, restrições, expressões calculadas e consumidores entre bases. Scripts de implantação e novos objetos também precisam seguir o resultado escolhido.

Procure valores que se tornarão iguais antes de reconstruir um índice único. Chaves diferentes apenas por maiúsculas ou acentos podem colidir. Resolva essas situações com um mapeamento aprovado, sem descartar arbitrariamente um cliente e seus relacionamentos.

A ordem de classificação também afeta paginação e exportações. Adicione um critério único de desempate e teste valores multilíngues representativos, não apenas ASCII. Inclua variações de caixa, acentos, textos vazios e formatos reais aceitos pela aplicação.

Por fim, valide resultado e custo. Compare identificadores associados, linhas intermediárias sem correspondência e duplicatas; depois examine leituras e plano de execução. Uma consulta que voltou a executar comprova apenas que o conflito desapareceu. As relações de negócio e o comportamento dos índices ainda precisam ser verificados para considerar a correção completa.

Referências técnicas: Microsoft Learn: Collation and Unicode · Microsoft Learn: COLLATE.

Pergunte sobre este artigo

Tem alguma dúvida sobre este tema?

Conte o que você está avaliando ou onde encontrou dificuldades. Responderemos com uma recomendação prática.

Inquiries are not enabled in this preview.

Fazer uma pergunta sobre este artigo