Oracle
 sql >> Base de données >  >> RDS >> Oracle

L'insertion de caractères nationaux dans une colonne oracle NCHAR ou NVARCHAR ne fonctionne pas

Edit:Notez que la meilleure façon de gérer UTF sur Oracle est de créer la base de données à l'aide du jeu de caractères de base de données AL32UTF8 et d'utiliser des colonnes varchar2 ordinaires. L'un des problèmes liés à l'utilisation des colonnes nchar est qu'oracle ne peut pas utiliser d'index pour les colonnes char/varchar2 ordinaires lorsque les arguments sont envoyés en tant que nchar par défaut.

Quoi qu'il en soit :si vous ne pouvez pas convertir la base de données :

Tout d'abord, les littéraux Unicode doivent être préfixés par un 'n', comme ceci :

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

*) Les encodages 8 bits ne peuvent pas gérer ce texte

Malheureusement, cela ne suffit pas.

Pour une raison quelconque, le comportement par défaut des clients de base de données consiste à traduire tous les littéraux de chaîne dans le jeu de caractères de la base de données, ce qui signifie que les valeurs seront modifiées avant même que la base de données ne voie la chaîne.

Les clients ont besoin d'une certaine configuration pour pouvoir insérer un caractère unicode dans une colonne NCHAR ou NVARCHAR :

SQL Plus sur Unix

Ces variables environemnet configurent l'environnement unix et sqlplus pour utiliser les fichiers UTF-8, et configurent également sqlplus pour envoyer des littéraux de chaîne en unicode.

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

(en_US.UTF-8 est pour Solaris - Linux ou d'autres systèmes peuvent avoir besoin de chaînes différentes, utilisez locale -a pour répertorier les paramètres régionaux pris en charge.)

Pilote JDBC

Les applications utilisant le pilote Oracles JDBC doivent avoir la propriété système suivante définie pour envoyer des littéraux de chaînes en Unicode.

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

Développeur SQL

Localisez sqldeveloper.conf et ajoutez les lignes suivantes :

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

SQL Plus sur Microsoft Windows

Je n'ai pas essayé si SQLplus sur Microsoft Windows ou Toad gère du tout utf-8.Sqlplusw.exe peut le faire, et les paramètres de registre suivants peuvent faire l'affaire.

NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORA_NCHAR_LITERAL_REPLACE=true