21 de out. de 2009

Lidando com acentos no SQL

Pessoal, ontem estava fazendo uma importação de um arquivo CSV, na verdade hoje ainda estou nele e está de rosca, mas enfim, um dos problemas que tive foram na parte das cidades, onde umas estavam com acentos e outras não, ex: São Paulo –> Sao Paulo.

Isto pode ser corrigido com o collation (configuração e maneira como o banco de dados trabalha com os caracteres) de várias maneiras.

No SQL Server ele herda o collation do banco ao criar uma tabela. e isto pode ser personalizado a nível de coluna, até mesmo de SQL.

image

O collation default, no meu caso, estava como o do Windows – “Latin1_General”.

image

No meu caso alterei a coluna da minha tabela para o “Latin1_General_CI_AI”, que armazena os caracteres, mas fica indiferente na hora da consulta.

image

Sendo assim, eu posso fazer um where com “São Paulo”, ou “Sao Paulo” e o resultado é o mesmo.

Não é muito bom generalizar, então apliquei somente na coluna de nome da cidade neste caso para poder usar com o LINQ. Ainda não achei uma forma de fazer o LINQ executar o collation no sql, o que seria fantástico, pois em uma instrução de SQL normal conseguimos fazer algo assim:

select * from cidade where Nome like '%São%'
collate Latin1_General_CI_AI

image

Para alterar uma coluna da tabela, você pode usar o SQL Management, clicando com o Botão direito na tabela > Design:

image

Depois selecione a coluna e na janela de column properties localize o item collation:

image

Ou então criar alterar a coluna da tabela passando o collation:

CREATE TABLE dbo.Tmp_Cidade
    (
    Id int NOT NULL IDENTITY (1, 1),
    Uf varchar(2) NOT NULL,
    Nome varchar(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
    )  ON [PRIMARY]

Obs: Não funciona para “Ç”

Obs: Com a coluna alterada o LINQ funciona normalmente.

0 comentários: