Como realizar consultas Case Sensitive no SQL Server? – Parte 01

 

Esta já foi uma das questões mais realizadas por quem trabalha com SQL Server no dia-a-dia e em seus fóruns pela internet, e ainda é para aqueles que não trabalham com a versão mais recente deste SGBD. Ao longo dos anos, diferentes programadores apresentaram diferentes soluções, e neste artigo serão apresentadas algumas delas considerando versões do SQL Server 6.5 até a 2005.

Case Insensitive x Case Sensitive no SQL Server

Uma instalação padrão do SQL é case insensitive, o que significa que o SQL Server não faz diferença entre caracteres/letras maiúsculas ou minúsculas. Ou seja, a palavra “SQL Magazine” é tratada da mesma forma que “SQL MAGAZINE” ou “sql magazine”. Vamos ver o que controla este mecanismo de case sensitive do SQL Server. No SQL Server 6.5 e 7.0, você pode selecionar o que eles chamam de “sort order” (ordenação textual), enquanto instalando o SQL Server.

 

A ordenação textual define como os caracteres suportados pela página de código são comparados e avaliados. A ordenação textual padrão é 'case insensitive'. Se você deseja que o SQL Server realize consultas case sensitive, você precisa selecionar a ordenação textual binária no momento da instalação do SQL Server (6.5 ou 7.0). Nessas versões (SQL Server 6.5 e 7.0), a ordenação textual é definida no nível do servidor e não pode ser manipulado no nível do banco de dados. Se você deseja mudar a ordenação textual de uma instância de um SQL Server 6.5 ou 7.0 existente, você deve fazer um rebuild do banco de dados mestre (master) usando o utilitário rebuildm. Não existe nenhuma outra forma agradável de fazer isso.

A terminologia com o tempo tem mudado, e agora uma ordenação textual é chamada de “collation” (colação) no SQL Server 2000. ANSI SQL:99 usa também a palavra “collation”. Por padrão, o SQL Server 2000 é instalado com a colação no formato case insensitive. Você deve mudar a colação do servidor no momento da instalação se você deseja utilizar o formato case sensitive. No entanto, o SQL Server 2000 já permite que você especifique a colação no nível do banco de dados assim como no nível de colunas. Isso significa que você pode ter uma instalação padrão do SQL Server com a colação no formato case insensitive, mas um banco de dados específico tendo uma colação no formato case sensitive.

Exemplos de consultas clássicas no formato case sensitive

 

Vamos ver agora alguns motivos que nos levariam a realizar consultas case sensitive. O exemplo clássico é comparação de senhas. Pessoas usam combinação de caracteres maiúsculos e minúsculos em suas senhas, apenas para tornar a senha mais segura. Mas seria impossível fazer isso se o banco de dados não levasse em consideração a diferença entre os caracteres. Para manter os usuários satisfeitos e suas senhas seguras, programadores preferem uma comparação em case sensitive neste caso.

 

Aqui um outro exemplo: pense na situação onde o usuário está pesquisando em sua tabela pela frase "revistas técnicas", e ela não está apta a encontrar exatamente esse termo apenas porque esta frase está armazenada no banco de dados como "Revistas Técnicas". Se isso acontecer em um banco de dados servindo como catálogo on-line, você iria perder várias vendas. Uma forma de evitar este problema seria armazenar tudo em letras minúsculas e converter as entradas dos usuários para letras minúsculas antes de comparar com os dados da tabela. Muito trabalhosa, não? Essa abordagem não seria a mais recomendada.

A seguir serão apresentados alguns métodos que podem ser empregados para consultas case sensitives no SQL Server.

Cenário a ser seguido nos exemplos descritos no artigo

 

Todos os exemplos deste artigo são baseados na tabela e dados apresentada na Listagem 1.

 

Listagem 1. Tabela a ser usada nos exemplos do artigo

 

CREATE TABLE dbo.Customers

(

         CustID char(8) NOT NULL PRIMARY KEY CLUSTERED,

         CustPassword varchar(15) NOT NULL,

         CustName varchar(25) NOT NULL,

         CustEmail varchar(60) NOT NULL,

         CustAddress varchar(100) NOT NULL

)

GO

 

INSERT INTO dbo.Customers VALUES('USA00001', 'TheUnbreakable', 'John', 'John.Smith@SomeDom.com', '10932,Bigge Rd., Menlo Park, CA')

 

INSERT INTO dbo.Customers VALUES('USA00002', 'ABCxyz012789', 'Heather', 'HGraham@SomeDom.com', '18 Broadway Av. San Francisco, CA')

 

INSERT INTO dbo.Customers VALUES('EUR00001', 'MagicNSparkle', 'Vyas', 'VyasKN@SomeDom.com', '18 Grove Mead, Herts, AL09 7JK, UK')

 

INSERT INTO dbo.Customers VALUES('ASA00001', 'aAbBcCXyZ', 'Franklin', 'FMayer@SomeDom.com', '22 Main Street, Singapore')

 

INSERT INTO dbo.Customers VALUES('OZ000001', 'DOWNundah', 'Steve', 'SWaugh@SomeDom.com', '321, Cricket Way, Melbourne, Australia')


--NOTA: O termo VALUES foi omitido nas declarações de INSERT acima por simplicidade.
--Isso não é uma boa prática e você deveria sempre incluir o termo VALUES nas declarações de INSERT.

Consulta em bancos de dados case sensitives

Considere o seguinte exemplo que busca na tabela de Clientes (Customers) por um dado ID (CustID) e senha (password). Em um servidor de banco de dados com colação case insensitive esta consulta irá ignorar o tipo de caractere (maiúsculo ou minúsculo) e irá procurar uma linha até que o valor seja encontrado, independentemente de qual tipo de caractere é usado na entrada. Como o parâmetro @CustID 'usa00001' identifica o CustID com o valor 'USA00001' e o parâmetro @CustPassword 'theunbreakable' identifica o CustPassword com o valor 'TheUnbreakable', a consulta descrita na Listagem 2 imprime ao final a mensagem 'Cliente Encontrado!'.

 

Listagem 2. Consulta em um banco case insensitive

DECLARE @CustID char(8), @CustPassword varchar(15)

 

SET @CustID = 'usa00001'

SET @CustPassword = 'theunbreakable'

 

IF EXISTS

(

         SELECT 1

         FROM dbo.Customers

         WHERE         CustID = @CustID

                   AND CustPassword = @CustPassword

)

BEGIN

         PRINT 'Cliente Encontrado!'

END

ELSE

BEGIN

         PRINT 'ID de Cliente ou Senha Inválida!'

END

GO

 Agora nosso objetivo é escrever consultas que realizam comparações case sensitive.  Serão apresentados alguns métodos populares, e mostraremos como tornar estes métodos eficientes. É importante notar que se e quando você migra tais consultas para um banco de dados case sensitive, é melhor descartar estes métodos e realizar a consulta normalmente.