web-dev-qa-db-ja.com

CMDプロンプトが、Oracleデータベースに正しく格納されているUnicode文字を表示できない

私は、Oracleデータベース、PL/SQL開発者、JDBCの文字セット/エンコーディングの問題に取り組んできました。これらは私が達成したいものです。

  1. ブラウザからデータベースにUnicode文字を入力する
  2. データベースから正しく取得されたUnicode文字をブラウザ、CMDプロンプト、およびPL/SQL開発者で表示します

そして、これらは私がやったことです:

  1. 次の手順に従って、サーバーの文字セットを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
    
  2. Regeditのシステム環境変数AL32UTF8に値NLS_LANGを追加し、AMERICAN_AMERICA.AL32UTF8の下のNLS_LANGAMERICAN_AMERICA.AL32UTF8に変更して、クライアントの文字セットをHKEY_LOCAL_MACHINE>SOFTWARE>Oracle>KEY_OraDB12Home1に変更します。

  3. 「ツール」>「設定」>「ファイル」>「フォーマット」>「P/SDのエンコード」で「常にUTF8」を確認します

最終的に、ブラウザまたは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>
1
Ivan Huang

データベースを破損している可能性が高いため、バックアップから完全に復元することを検討してください。

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コード単位")を取得できます。

1

コードページは936(中国語)です。 SQL "Plusを起動すると、このコードページはCMDから継承されます。

通常、2つの可能性があります。

  1. セットする NLS_LANGコードページに応じて(環境変数として、またはレジストリ内で)。例set NLS_LANG=.WE8MSWIN1252中央ヨーロッパのPCの場合、言語および地域情報は文字セットには関係ありません。

    あなたの場合、この解決策は不可能であるようです 文字セットのリスト コードページ936にはOracle文字セットがありません。しかし、このWikipediaの記事 コードページ1386を参照してください 。おそらく、「GB 18030」を使用できます。これはset NLS_LANG=.ZHS32GB18030または "GB 2312"、つまりset NLS_LANG=.ZHS16CGB231280

  2. 2番目の解決策は、SQL * Plusを起動する前にCMDでコードページを切り替えることです。使用する chcp 65001コードページをUTF-8に設定するため。ただし、CMDでUTF-8を使用すると、いくつかの問題に直面する場合があります。 この説明 を参照してください。

詳細については、 この答え も参照してください。

0