私は、Oracleデータベース、PL/SQL開発者、JDBCの文字セット/エンコーディングの問題に取り組んできました。これらは私が達成したいものです。
そして、これらは私がやったことです:
次の手順に従って、サーバーの文字セットをAL32UTF8
に変更します。
SQL>SHUTDOWN IMMEDIATE
SQL>STARTUP MOUNT;
SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL>ALTER DATABASE OPEN;
SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE AL32UTF8;
SQL>update props$ set VALUE$='UTF8' where NAME='NLS_NCHAR_CHARACTERSET';
SQL>ALTER SYSTEM DISABLE RESTRICTED SESSION;
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
Regeditのシステム環境変数AL32UTF8
に値NLS_LANG
を追加し、AMERICAN_AMERICA.AL32UTF8
の下のNLS_LANG
をAMERICAN_AMERICA.AL32UTF8
に変更して、クライアントの文字セットをHKEY_LOCAL_MACHINE>SOFTWARE>Oracle>KEY_OraDB12Home1
に変更します。
最終的に、ブラウザまたはP/SDからUnicode文字をデータベースに追加した場合、それらはブラウザとP/SDでは正しく表示されますが、CMDプロンプトでは表示されません。 CMDプロンプトからデータベースに追加された場合、どこにでも正しく表示できます。今のところ、ブラウザとP/SDから入力された文字はUnicode文字ですが、サーバーとクライアントの両方の文字セットがAL32UTF8に設定されているため、これもUnicodeであるはずのCMD入力用ではありません。正しい表示と正しくない表示の例を次に示します。
P/SDの場合:(正解)
SQL> select title from posts where id=134;
TITLE
--------------------------------------------------------------------------------
测试
SQL> SELECT DUMP(title, 1016) FROM posts where id=134;
DUMP(TITLE,1016)
--------------------------------------------------------------------------------
Typ=1 Len=6 CharacterSet=AL32UTF8: e6,b5,8b,e8,af,95
コマンドプロンプト:(不正解)
SQL> select title from posts where id=134;
TITLE
--------------------------------------------------------------------------------
娴嬭瘯
SQL> SELECT DUMP(title, 1016) FROM posts where id=134;
DUMP(TITLE,1016)
--------------------------------------------------------------------------------
Typ=1 Len=6 CharacterSet=AL32UTF8: e6,b5,8b,e8,af,95
SQL>
データベースを破損している可能性が高いため、バックアップから完全に復元することを検討してください。
ALTER DATABASE CHARACTER SET ...
はOracleバージョン9までサポートされ、 特定の条件 でのみ機能しました。
Oracleサポートからの指示がない限り、INTERNAL_USE
句を使用したり、Oracleシステムテーブルを更新したりしないでください。既存のデータベースの文字セットを変更する場合は、次の手順に従ってください。 文字セットの移行
WHERE NAME='NLS_NCHAR_CHARACTERSET'
のみを変更したので、おそらく幸運でした。各国文字セットは現在ほとんど使用されていません。おそらく、すべてを破壊したわけではありません。
とにかく、項目2.)と3.)は正しいです。 32ビットチェックの場合は、レジストリキーHKEY_LOCAL_MACHINE>SOFTWARE>Wow6432Node>Oracle>KEY_OraDB12Home1
も確認してください
あなたのデータが本当にUTF-8実行で保存されているかどうかを確認するために
SELECT DUMP(YOUR_COLUMN, 1016) FROM YOUR_TABLE;
そして、バイナリ値を確認します。比較のために、ページ nicodeコードコンバーター を使用して、任意の文字列のUTF-8バイナリ値(フィールド "UTF-8コード単位")を取得できます。
コードページは936(中国語)です。 SQL "Plusを起動すると、このコードページはCMDから継承されます。
通常、2つの可能性があります。
セットする NLS_LANG
コードページに応じて(環境変数として、またはレジストリ内で)。例set NLS_LANG=.WE8MSWIN1252
中央ヨーロッパのPCの場合、言語および地域情報は文字セットには関係ありません。
あなたの場合、この解決策は不可能であるようです 文字セットのリスト コードページ936にはOracle文字セットがありません。しかし、このWikipediaの記事 コードページ1386を参照してください 。おそらく、「GB 18030」を使用できます。これはset NLS_LANG=.ZHS32GB18030
または "GB 2312"、つまりset NLS_LANG=.ZHS16CGB231280
2番目の解決策は、SQL * Plusを起動する前にCMDでコードページを切り替えることです。使用する chcp 65001
コードページをUTF-8に設定するため。ただし、CMDでUTF-8を使用すると、いくつかの問題に直面する場合があります。 この説明 を参照してください。
詳細については、 この答え も参照してください。