Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Das Einfügen nationaler Sonderzeichen in eine Orakel-NCHAR- oder NVARCHAR-Spalte funktioniert nicht

Bearbeiten:Beachten Sie, dass der beste Weg, UTF auf Oracle zu handhaben, darin besteht, die Datenbank mit dem Datenbankzeichensatz AL32UTF8 zu erstellen und gewöhnliche varchar2-Spalten zu verwenden. Eines der Probleme bei der Verwendung von nchar-Spalten besteht darin, dass Oracle keine Indizes für gewöhnliche char/varchar2-Spalten verwenden kann, wenn Argumente standardmäßig als nchar gesendet werden.

Wie auch immer:Wenn Sie die Datenbank nicht konvertieren können:

Erstens muss Unicode-Literalen ein 'n' vorangestellt werden, wie hier:

select n'Language - Språk - Język' from dual;

*) 8-Bit-Kodierungen können diesen Text nicht verarbeiten

Leider reicht das nicht.

Aus irgendeinem Grund besteht das Standardverhalten für Datenbankclients darin, alle Zeichenfolgenliterale in den Datenbankzeichensatz zu übersetzen, was bedeutet, dass Werte geändert werden, noch bevor die Datenbank die Zeichenfolge zu sehen bekommt.

Die Clients benötigen eine gewisse Konfiguration, um ein Unicode-Zeichen in eine NCHAR- oder NVARCHAR-Spalte einfügen zu können:

SQL Plus unter Unix

Diese Umgebungsvariablen richten die Unix-Umgebung und sqlplus so ein, dass sie UTF-8-Dateien verwenden, und konfigurieren sqlplus auch so, dass Zeichenfolgenliterale in Unicode gesendet werden.

NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LC_CTYPE="en_US.UTF-8"
ORA_NCHAR_LITERAL_REPLACE=true

(en_US.UTF-8 ist für Solaris - Linux oder andere Systeme benötigen möglicherweise andere Zeichenfolgen, verwenden Sie locale -a um unterstützte Gebietsschemata aufzulisten.)

JDBC-Treiber

Anwendungen, die Oracles JDBC-Treiber verwenden, müssen die folgende Systemeigenschaft definiert haben, um Zeichenfolgenliterale in Unicode zu senden.

-Doracle.jdbc.defaultNChar=true 
-Doracle.jdbc.convertNcharLiterals=true

SQL-Entwickler

Suchen Sie sqldeveloper.conf und fügen Sie die folgenden Zeilen hinzu:

AddVMOption -Doracle.jdbc.defaultNChar=true 
AddVMOption -Doracle.jdbc.convertNcharLiterals=true

SQL Plus unter Microsoft Windows

Ich habe nicht versucht, ob SQLplus unter Microsoft Windows oder Toad überhaupt mit utf-8 umgehen kann. Sqlplusw.exe kann das tun, und die folgenden Registrierungseinstellungen können den Zweck erfüllen.

NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORA_NCHAR_LITERAL_REPLACE=true