Database Case Insensitive

lunedì 11 dicembre 2006 alle 11:02 | Pubblicato su Installation and Configuration, SQL | 1 commento

Persisto nella mia incoerenza nell’utilizzare terminologie inglesi. Voglio parlare della gestione delle maiuscole e minuscole in un database Oracle. Normalmente le lettere maiuscole sono distinte da quelle minuscole, il codice ascii della lettera “A” è diverso da quello della lettera “a”. La lettera è la stessa, ma i caratteri sono diversi. Quindi se in una tabella Oracle memorizzo in una colonna di tipo Varchar2 o Char la stringa “Cristian” e poi vado a cercare la stringa “cristian” non otterrò alcun risultato. Questo è quello che significa il termine inglese “case insensitive”. Viceversa se non faccio distinsione fra maiuscole e minuscole allora sto parlando di “case insensitive”.

Pare incredibile ma ci sono applicazioni o meglio utenti che richiedono che un database sia case insensitive. Se lo fanno fin dall’inizio la cosa è gestibile, se lo fanno dopo è un po’ più difficile. Soprattutto quando quello che si vuole non è veramente un database che non distingua fra maiuscole o minuscole ma un database in cui le ricerche non distinguano tra maiuscole o minuscole. Cioè nel database conservo la distinzione tra maiuscole e minuscole, ma quando faccio le ricerche non voglio tale distinzione.

Nelle tre versioni di database Oracle su cui lavoro attualmente, 9iR2, 10gR1, 10gR2 il problema è stato affrontato e direi che solo nella versione 10gR2 è stato veramente risolto. Dico veramente perchè nelle versioni 9iR2 e 10gR1 c’era il modo di fare ricerche case insensitive ma solo con l’uguaglianza, ad esempio “select * from t where name=’gigi'”. Con il “LIKE” la stessa query non è più case insensitive. Questo significa che “select * from t where name like ‘gigi%'” non ritorna lo stesso risultato.

Il modo per ottenere le ricerche case insensitive in Oracle 9iR2 (ma solo per ricerche con l’uguale!) è che di cambiare i parametri di sessione NLS_COMP e NLS_SORT:
SQL>ALTER SESSION SET NLS_COMP=ANSI;
SQL>ALTER SESSION SET NLS_SORT=GENERIC_BASELETTER;
In 10gR1 le variabili sono le stesse, ma i valori diversi:
SQL> ALTER SESSION SET NLS_COMP=ANSI;
SQL> ALTER SESSION SET NLS_SORT=BINARY_CI;
In 10gR2
SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC;
SQL> ALTER SESSION SET NLS_SORT=BINARY_CI;

Finalmente c’è una soluzione coerente, perché francamente ha fatto un brutto scherzo la soluzione precedente che si comportava in modo diverso nei confronti con l’uguaglianza e con il like.

1 commento »

RSS feed for comments on this post. TrackBack URI

  1. […] Maggio 11th, 2007 · No Comments In seguito ad dei test scaturiti da un thread di discussione sul newsgroup comp.databases.oracle.server sono costretto a scrivere un post di aggiornamento di un vecchio post di dicembre. […]


Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Crea un sito o un blog gratuitamente presso WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: