NLS parameter - CHARACTERSET

NLS sta per National Language Support

Parametri definiti a livello di sessione:
select * from nls_session_parameters

Modifica dei parametri a livello di sessione
ALTER SESSION SET NLS_<> = <>

Parametri definiti a livello di istanza:
select * from nls_instance_parameters

Parametri definiti a livello di database (definiti al momento della creazione del db):
select * from nls_database_parameters

Elenco dei valori ammessi nel database per i parametri characterset, sort, territory e language.
select * from v$nls_valid_values

NLS_LANG=<NLS_LANGUAGE>_<NLS_TERRITORY>.<NLS_CHARACTERSET>

NLS_LANG è una variabile d'ambiente impostata lato client che definisce il linguaggio, il territorio e il character set.
NLS_LANGUAGE definisce i il linguaggio usato, il nome dei giorni e mesi e loro abbreviazioni, i simboli per rappresentare a.m., p.m., AD e BC, il metodo di ordinamento di una sql statement e le stringhe di risposta affermative e negative (Yes e No).
NLS_TERRITORY definisce invece il formato delle date, il simbolo decimale, il primo giorno della settimana, simbolo del credito e il separatore.
NLS_CHARACTERSET definisce il "database character set" cioè l'encoding dei tipi di dati CHAR, VARCHAR2, LONG e CLOB.



Per language uguale ad America è WE8ISO8859P1 dove
WE è la regione West Europe, 8 è il numero di bit usato per memorizzare un carattere, ISO8859P1 è invece il nome del charater set standard
US7ASCII sta per Usa, 7 bit per carattere e ASCII il codice standard americano.Non è un unicode character set.

AL32UTF8 è il nome Oracle per la codifica UTF-8 dello standard Unicode character set.
Un carattere viene memorizzato come multiple-byte fino al massimo di 4 byte (cioè 32 bit) per carattere.

Cosa significa Unicode? 
E' un insieme di caratteri codificati che permette di registrare informazioni da un qualsiasi linguaggio, quindi per ogni carattere, indipendente dalla piattaforma, programma o linguaggio associa un codice univoco.
Quindi lo standard Unicode è il set di caratteri universale che supporta la maggior parte delle lingue attualmente parlate nel mondo pertanto la scelta di AL32UTF8 per il set di caratteri del database è di solito la best practice.
Il set di caratteri predefinito utilizzato da Oracle Universal Installer (OUI) e Database Configuration Assistant (DBCA) per le piattaforme UNIX, Linux e Microsoft Windows non è AL32UTF8, ma un set di caratteri Microsoft Windows noto come code page ANSI. Il particolare set di caratteri viene selezionato in base alla lingua corrente (locale) della sessione del sistema operativo che ha avviato OUI o DBCA. Se la lingua è l'inglese americano o una lingua dell'Europa occidentale, il set di caratteri predefinito è WE8MSWIN1252.
Ogni Code Page ANSI di Microsoft Windows può memorizzare dati da una sola lingua o da un gruppo limitato di lingue, come solo Europa occidentale, solo Europa orientale o solo giapponese

NLS_CHARACTERSET non può essere cambiato a livello di sessione con il comando "alter session..." ma solo a livello di db.


Si può migrare DEV che è in UTF8 in  PROD che è WE8ISO8859P15 e viceversa?
If you intend to have a true DEV, so that you can test correctly your application before putting it to PROD, you should have a DEV Database as close as possible to PROD.
WE8ISO8859P15 stores characters in *1 Bytes* and UTF8 (or AL32UTF8) can store characters on up to *4 Bytes*. It's a big difference.
For instance, if you export/import data from PROD to DEV you may have the famous ORA-12899: value too large for column ... error. This error is often due to you keep the same Table structure between PROD and DEV and that by default ( nls_length_semantics = bytes ) a VARCHAR2 (100) let you store *100 Bytes* (and not 100 characters). But, in this example, *100 Bytes* let you store *100* characters in WE8ISO8859P15 and may be no more than *25* characters in UTF8.
Of course, if you export/import data from DEV to PROD you'll have charset conversion.
More over, the export/import doesn't manage very well the nls_length_semantics parameter so, you may have some surprise and, you may have to create firstly the Tables empty before importing the data.
So, no I don't think it's a nice idea.



NLS_NCHAR_CHARACTERSET definisce il "National Character Set" cioè l'encoding per i tipi di dati NCHAR, NVARCHAR, NCLOB che memorizzano dati di tipo national character set che di default è AL16UTF16. Pertanto i dati memorizzati saranno di tipo unicode.



NLS_SORT definisce il metodo di ordinamento binario o linguistico di una istruzione SQL. Influenza il piano di esecuzione delle query.
Dipende dal valore del parametro NLS_LANGUAGE.
Ad esempio se il linguaggio è American, il parametro NLS_SORT assume il valore BIANARY.
Per usare un ordinamento linguistico eseguire il comando seguente
alter session set  NLS_SORT = German
I valori ammessi sono presenti nella vista V$nls_valid_values.
NLS_SORT definisce il metodo di ordinamento di default per la funzione NLSSORT e la clausola WHERE pertanto questa clausola non è influenzata dal valore di nls_comp.
L'ordinamento per le istruzioni sql che contengono order by, between, case when, having, in/out, start with è invece definito da NLS_COMP.
Se si vuole impostare un ordinamento linguistico case_insensitive aggiungere al nome del linguaggio la stringa  _CI mentre per un ordinamento linguistico accent_insensitive aggiungere _AI.
NLS_SORT= German_CI
Anche l'ordinamento binario può avere le due configurazioni BINARY_AI e BINARY_CI.
L'ordinamento accent_insensitive è di default case_insensitive.



NLS_COMP è utilizzato insieme a nls_sort per facilitare l'ordinamento linguistico. Di default è BINARY e se si imposta al valore ANSI allora l'ordinamento per le istruzioni sql che contengono order by, between, case when, having, in/out, start with e where
sarà linguistico secondo il linguaggio impostato in nls_sort senza dover utilizzare la funzione nlssort.
Il confronto binario è più veloce e richiede meno risorse di uno linguistico ma in un ordinamento di testi (in linguaggio naturale) fornisce un risultato diverso da quello che si aspetta l'utente.


NLS_LENGTH_SEMANTICS definisce la lunghezza di una stringa di caratteri.
Ad esempio se creo una tabella
create table prova (dipart varchar2(15));
Se il parametro è impostata a BINARY (default) vuol dire ogni carattere richiede 3 byte, la colonna può contene stringhe di 4 caratteri.
Se il parametro è impostato a CHAR allora la colonna può contenere 15 caratteri indipendentemente dal numero di byte richiesti dal singolo carattere.

I parametri NLS possono essere modificati con 5 metodi che seguono la seguente priorità:
1 impostare nella SQL funzione
2 sessione corrente (Alter session...)
3 client  (Alter session...)
4 istanza (modificare i parametri di inizializzazione)
5 default setting (a livello di istanza)




Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database