Modifica:si noti che il modo migliore per gestire UTF su Oracle è creare il database utilizzando il set di caratteri del database AL32UTF8 e utilizzare le colonne varchar2 ordinarie. Uno dei problemi con l'utilizzo delle colonne nchar è che Oracle non può utilizzare gli indici per le colonne char/varchar2 ordinarie quando gli argomenti vengono inviati come nchar per impostazione predefinita.
Comunque:se non riesci a convertire il database:
Innanzitutto, i letterali unicode devono essere preceduti da una 'n', in questo modo:
select n'Language - Språk - Język' from dual;
*) Le codifiche a 8 bit non possono gestire questo testo
Sfortunatamente, questo non è abbastanza.
Per qualche ragione, il comportamento predefinito per i client di database è tradurre tutte le stringhe letterali nel set di caratteri del database, il che significa che i valori verranno modificati anche prima che il database possa vedere la stringa.
I client necessitano di una configurazione per poter inserire un carattere unicode in una colonna NCHAR o NVARCHAR:
SQL Plus su Unix
Queste variabili environemnet configurano l'ambiente unix e sqlplus per l'utilizzo di file UTF-8 e configurano anche sqlplus per inviare stringhe letterali in unicode.
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LC_CTYPE="en_US.UTF-8"
ORA_NCHAR_LITERAL_REPLACE=true
(en_US.UTF-8 è per Solaris - Linux o altri sistemi potrebbero richiedere stringhe diverse, utilizzare locale -a
per elencare le localizzazioni supportate.)
Driver JDBC
Le applicazioni che utilizzano il driver Oracle JDBC devono avere la seguente proprietà di sistema definita per inviare stringhe letterali in unicode.
-Doracle.jdbc.defaultNChar=true
-Doracle.jdbc.convertNcharLiterals=true
Sviluppatore SQL
Individua sqldeveloper.conf e aggiungi le seguenti righe:
AddVMOption -Doracle.jdbc.defaultNChar=true
AddVMOption -Doracle.jdbc.convertNcharLiterals=true
SQL Plus su Microsoft Windows
Non ho provato se SQLplus su Microsoft Windows o Toad gestisce utf-8. Sqlplusw.exe potrebbe farlo e le seguenti impostazioni del registro potrebbero fare il trucco.
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORA_NCHAR_LITERAL_REPLACE=true