Insertion de caractères nationaux dans un oracle NCHAR ou NVARCHAR colonne ne fonctionne pas
Lors de l'insertion de chaînes de caractères dans une base de données oracle, certains caractères sont remplacés par des points d'interrogation, même si elles sont
inséré dans un NCHAR ou NVARCHAR de la colonne qui doit être capable de gérer tous les caractères Unicode.
Ce qui se passe à l'aide soit d'Oracle SQL Developer, sqlplus ou à l'aide du pilote JDBC.
La base de données NLS_CHARACTERSET est fixé à WE8ISO8859P1 (europe occidentale iso-8859-1)
Le NLS_NCHAR_CHARACTERSET utilisé pour NCHAR colonnes est définie al16utf16, respectivement. (UTF-16)
Tout caractère qui n'est pas dans le NLS_CHARACTERSET semble être remplacé par un point d'interrogation inversé.
- Je suis auto de répondre à cette depuis que j'ai passé une semaine en essayant de se faire... j'espère que google trouve...
- Notez que la bonne façon de support UTF8 sur Oracle, est de créer la base de données à l'aide de la base de données du jeu de caractères AL32UTF8, et l'utilisation ordinaire varchar2 colonnes.
Vous devez vous connecter pour publier un commentaire.
Edit: à Noter que la meilleure façon de gérer l'UTF sur Oracle est de créer la base de données à l'aide de la base de données du jeu de caractères AL32UTF8, et l'utilisation ordinaire varchar2 colonnes. L'un des problèmes avec l'utilisation de colonnes nchar est que l'oracle ne peut pas utiliser les index pour les char/varchar2 colonnes lorsque les arguments sont envoyés en tant que nchar par défaut.
De toute façon: Si vous ne pouvez pas convertir la base de données:
D'abord, unicode littéraux doit être précédé d'un 'n', comme ceci:
Malheureusement, cela ne suffit pas.
Pour une raison quelconque, le comportement par défaut de la base de données clients est de traduire tous les littéraux de chaîne à la base de données du jeu de caractères,
ce qui signifie que les valeurs seront modifiées avant même la base de données est de voir la chaîne.
Les clients ont besoin d'un peu de configuration afin d'être en mesure d'insérer un caractère unicode dans un NCHAR ou NVARCHAR colonne:
SQL Plus sur Unix
Ces environemnet variables met en place l'environnement unix et sqlplus pour utiliser les fichiers UTF-8,
et aussi configurer sqlplus pour envoyer des littéraux de chaîne unicode.
(en_US.UTF-8 est pour Solaris Linux ou d'autres systèmes peuvent avoir besoin de différentes chaînes, utilisez
locale -a
à la liste des paramètres régionaux pris en charge.)Pilote JDBC
Applications à l'aide d'Oracles pilote JDBC doit avoir la propriété système suivante défini pour envoyer des chaînes littérales en unicode.
SQL Developer
Recherchez sqldeveloper.conf et ajouter les lignes suivantes:
SQL Plus sur Microsoft Windows
Je n'ai pas essayé si SQLplus sur Microsoft Windows ou Crapaud gère l'utf-8 en tout.
Sqlplusw.exe peut le faire, et les paramètres de registre suivants peuvent faire l'affaire.
Grâce KarlP - qui me va. De récapituler ce qui a fonctionné pour moi.
Insertion chinois ( tout utf8 ) du texte dans une colonne nvarchar d'un non-unicode base de données ( par exemple: ISO8859 etc ), à l'aide de sqlplus sur linux.
Ces db params sur mon système, notez qu'un seul octet codant pour le char, mais multi-octets pour nchare.
NLS_CHARACTERSET WE8ISO8859P1
NLS_NCHAR_CHARACTERSET AL16UTF16, RESPECTIVEMENT
par exemple:
Le " N " ajouter au début de la chaîne est important.
Aussi, devez définir l'env avant de commencer sqlplus,