Indice
Configurazione NLS_LANG per client Oracle
La configurazione del parametro NLS_LANG lato client è indispensabile per garantire la corretta conversione nel character set usato dal database.
Una errata configurazione NLS_LANG può avere effetti che variano da errate visualizzazioni di caratteri fino alla perdita di dati per via di errate conversioni.
Ci sono anche programmi che non necessitano di configurazione: http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html
NLS_LANG setting
Struttura della variabile:
NLS_LANG=NLSlanguage_NLSterritory.clientcharset
es: NLS_LANG=AMERICAN_AMERICA.AL32UTF8
dove:
- NLSlanguage è la lingua utilizzata i messaggi del client Oracle (errori)
- NLSterritory corrisponde al paese (country) utilizzato per le impostazioni internazionali (valuta, data, ora, separatori decimali e delle migliaia)
- clientcharset è il charset Oracle usato dal client
E' indispensabile che il clientcharset sia impostato correttamente.
Il valore di NLS_LANG è definito in Windows nelle chiavi del registry:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<oracle_home_name>
Se si tratta di un client 32bit su piattaforma a 64bit:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_<oracle_home_name>
Quale valore deve avere NLS_LANG ?
La parte “clientcharacterset” di NLS_LANG deve essere impostata al valore del charset Oracle corrispondente al codepage utilizzato dal client Windows (per applicazioni GUI. Per applicativi terminali/DOS il codepage è diverso. Vedi The correct NLS_LANG in a Windows Environment [ID 179133.1]
1. Determinare Windows ACP codepage
Il codepage delle applicazioni GUI Windows è presente nel regsitry:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\ entry "ACP"
2. Matchare ACP codepage Windows con charset Oracle
Dalla tabella qua sotto (da MOS 179133.1)
ANSI CodePage (ACP) - Oracle Client character set (3rd part of NLS_LANG) 1250 - EE8MSWIN1250 1251 - CL8MSWIN1251 1252 - WE8MSWIN1252 1253 - EL8MSWIN1253 1254 - TR8MSWIN1254 1255 - IW8MSWIN1255 1256 - AR8MSWIN1256 1257 - BLT8MSWIN1257 1258 - VN8MSWIN1258 874 - TH8TISASCII 932 - JA16SJIS 936 - ZHS16GBK 949 - KO16MSWIN949 950 - ZHT16MSWIN950 - except for Hong kong. 950 - (Hong Kong) ZHT16HKSCS31 / ZHT16HKSCS . Only possible on Windows 2000 and XP, not on Vista and 7, see Document 787371.1 Oracle Database Server support for HKCSC 1999, 2001 and 2004 character sets.
trovare il charset Oracle.
3. Impostare NLS_LANG
Il posto migliore è il registry. E' possibile impostare anche la variabile d'ambiente NLS_LANG ma questa avrebbe la precedenza sul registry (MOS 179133.1) e si applicherebbe a TUTTE le Oracle Home.
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<oracle_home_name>
Se si tratta di un client 32bit su piattaforma a 64bit:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_<oracle_home_name>
Configurazione applicazioni web (browser come client)
I browser che comunicano con applicazioni web che si interfacciano ad Oracle leggono la configurazione dall'header content/type-encoding.
Di default è ISO8859-1 (che non è il massimo…)
La cosa va fatta lato web server: definire sempre un header http (anche a livello di server web) perchè contenga l'encoding UTF-8
Il webserver andrà poi ad utilizzare il setting NLS_LANG (o niente se si tratta di connessione fatta con jdbc) per la connessione verso Oracle
Configurazione NLS_LANG per client Oracle Linux
Solo un esempio (quasi tutte le macchine linux recenti sono già unicode)
Controllare il charset del client
roberto@roberto-desktop:~$ locale LANG=en_US.utf8 LANGUAGE= LC_CTYPE="en_US.utf8" LC_NUMERIC="en_US.utf8" LC_TIME="en_US.utf8" LC_COLLATE="en_US.utf8" LC_MONETARY="en_US.utf8" LC_MESSAGES="en_US.utf8" LC_PAPER="en_US.utf8" LC_NAME="en_US.utf8" LC_ADDRESS="en_US.utf8" LC_TELEPHONE="en_US.utf8" LC_MEASUREMENT="en_US.utf8" LC_IDENTIFICATION="en_US.utf8" LC_ALL=
in questo caso abbiamo un client unicode (UTF8), quindi settare NLS_LANG di conseguenza: export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
Per dettagli vedi The correct NLS_LANG setting in Unix Environments [ID 264157.1]
Riferimenti:
AL32UTF8 / UTF8 (Unicode) Database Character Set Implications
Examples and limits of BYTE and CHAR semantics usage (NLS_LENGTH_SEMANTICS) [ID 144808.1]
NLS_LANG Explained (How does Client-Server Character Conversion Work?) [ID 158577.1]
The correct NLS_LANG in a Windows Environment [ID 179133.1]
The correct NLS_LANG setting in Unix Environments [ID 264157.1]