giovedì 18 gennaio 2007

Case Sensitive SQL Server 2005 Collation

Mi è capitato di recente di dover creare e gestire un database su Microsoft SQL Server 2005 Express Edition, la versione gratuita di MS SQL Server (libera da ogni costo anche per utilizzi commerciali)

L'idea non è malvagia, visto la potenza che ti mette a sisposizione gratuitamente: serve comunque un server e un bel po' di spazio su disco

Da niubbo, quando ho creato il database invece di lasciare la proprietà "collation" impostata come "default" ho specificato "Latin1_General_BIN"

«Chissà a che serve?» ho pensato, ma tutto funzionava e non c'ho fatto caso

Dopo un po' mi accorgo di una cosa: quando eseguo una query (una SELECT su alcuni campi di testo) noto con dispiacere che esegue una ricerca CASE SENSITIVE, cosa strana per SQL Server

Panico :|
Che succede ?_?

Ma niente paura, a tutto c'è rimedio, e Google ci aiuta sempre: basta saper usare un motore di ricerca e stabilire quali sono le parole chiave da cercare :D

In SQL Server 2005 (anche nei precedenti probabilmente) la clausola COLLATE che permette di stabilire come verranno trattate le stringhe: quello di default in genere comprende due impostazioni (oltre al charset):
CI: Case Insensitive (Ignora la differenza tra caratteri maiuscoli o minuscoli, il contrario è CS)
AS: Accents Sensitive (Fa differenza tra una "a" e una "à", il contrario è AI)
Girando questi due parametri si può impostare a proprio piacimento l'esecuzione delel query

In caso sia necessaria una query particolare (per esempio una query "case sensitive" su un db/tabella/campo che non lo è) è possibile specificare la clausola direttamente nella query

SELECT * FROM nome_tabella WHERE nome_colonna = 'fuFFa' COLLATE SQL_Latin1_General_CP1_CS_AS

La modifica di questa clausola si può fare tranquillamente dalle impostazioni relative al database, tramite l'interfaccia si SQL Server

Purtroppo una volta create le tabelle anche cambiando il tipo di collation al database, i campi già esistenti rimangono con le impostazioni precendenti

È necessario quindi reimpostare tutte i campi delle varie tabelle già esistenti, o tramite l'interfaccia, o tramite un comando SQL:

ALTER TABLE nome_tabella
ALTER COLUMN nome_colonna varchar(50) COLLATE SQL_Latin1_General_CP1_CI_AS

Buon divertimento :)

Nessun commento: