SQL Server modifica della Collation nella clausola WHERE

Le regole di confronto (Collation) di SQL Server vengono impostate durante l’impostazione e per impostazione predefinita vengono suggerite sulla base delle impostazioni locali del sistema operativo (come indicato il Impostazioni delle regole di confronto durante l’installazione).

Quindi se ad esempio si istalla SQL Server 2012 su un sistema operativo in lingua italiana la Collection di SQL Server viene impostata a Latin1_General_CI_AS dove CI indica Case Insensitive (nessuna distinzione tra maiuscole e minuscole), mentre AS indica Accent Sensitive (distinzione tra lettere accentate e non).

image

Oltre alla Collation di SQ Server (o a livello server) vi sono le seguenti altre Collation (Regole di confronto):

  • Collation a livello di database (per default impostata uguale a quella server durante la creazione del database)
  • Collation a livello di colonna (per default impostata uguale a quella database durante la creazione della tabella)
  • Collation a livello di espressione impostate al momento dell’esecuzione di un’istruzione SQL e interessano la modalità di restituzione di un set di risultati

Le Collation forniscono regole di ordinamento e proprietà di distinzione tra maiuscole e minuscole e tra caratteri accentati e non accentati per i dati. Le Collation utilizzate con dati di tipo carattere, quali char e varchar, definiscono la tabella codici e i caratteri corrispondenti che possono essere rappresentati per quel tipo di dati.

Selezionando le regole di confronto per un server, un database, una colonna o un’espressione, vengono assegnate determinate caratteristiche ai dati che influiranno sui risultati di svariate operazioni eseguite nel database. Ad esempio, quando viene costruita una query tramite ORDER BY, l’ordinamento del set di risultati può dipendere dalle regole di confronto applicate al database o specificate in una clausola COLLATE al livello di espressione della query.

Tornado all’esempio iniziale di un SQL Server installato su sistema operativo italiano che imposta per default una Collation a livello server Latin1_General_CI_AS che viene poi ereditata a livello database, colonna ed espressione, il problema che può presentarsi è quello di eseguire una query per estrapolare i record in cui, per esempio, in una colonna vi siano caratteri minuscoli.

Si prenda ad esempio il caso di un’ipotetica tabella Articoli in cui la colonna ID di tipo varchar rappresenta il codice articolo i cui valori dovrebbero essere maiuscoli. Si supponga di voler controllare se qualche codice articolo contiene caratteri minuscoli per errori dovuti ad esempio al programma gestionale o a introduzioni dati manuali.

La query che potrebbe essere utilizzata è la seguente:

SELECT UPPER(ID) AS IDUpper, *
FROM Articoli
WHERE ID <> UPPER(ID)

Tale query però non  estrarrà alcun dato dato la Collation Latin1_General_CI_AS non rileva distinzione tra maiuscole e minuscole.

Tramite la clusola COLLATE è però possibile forzare nella clausola WHERE una collation diversa di tipo CS (Case Sensitive):

SELECT UPPER(ID) AS IDUpper, *
FROM Articoli
WHERE ID <> UPPER(ID) COLLATE Latin1_General_CS_AS

Per una articolo sulla modifica della Collation nella clausola WHERE si veda Forcing Collation in the WHERE Clause.

Per ulteriori informazioni si vedano: