Strumenti Utente

Strumenti Sito


pub:oracle:configurazionenlsclient

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]

NLS_LANG Client Settings and JDBC Drivers [ID 115001.1]

pub/oracle/configurazionenlsclient.txt · Ultima modifica: 2012/10/01 09:54 da roberto.torresani@unitn.it