sql >> データベース >  >> RDS >> Oracle

nzloadを使用して特殊文字をロードする

    私はUnicode変換の問題にあまり精通していませんが、これは以前に自分で行ったことがあり、何が起こっていると思うかを示します。

    ここに表示されているのは、nzloadを使用した特殊文字の読み込みの問題ではなく、ディスプレイ/ターミナルソフトウェアがデータを表示する方法や、Netezzaが文字データを保存する方法の問題だと思います。 UTF-8(NetezzaがサポートするUnicodeエンコーディング)との間の二重変換が疑われます。それがどれであるかを推測できるかどうか見てみましょう。

    ここでは、デフォルトの(私にとって)リモート文字セットをLatin-1としてPuTTYを使用しています。

    $ od -xa input.txt
    0000000    5250    464f    5345    4953    4e4f    4c41    bfc2    000a
              P   R   O   F   E   S   S   I   O   N   A   L   B   ?  nl
    0000017
    
    $ cat input.txt
    PROFESSIONAL¿
    

    ここでは、 odから見ることができます ファイルには期待するデータしか含まれていませんが、 余分な文字が表示されるファイル。ファイルにない場合は、文字がディスプレイの翻訳に由来している可能性があります。

    PuTTY設定を変更してUTF-8をリモート文字セットにすると、次のように表示されます。

    $ od -xa input.txt
    0000000    5250    464f    5345    4953    4e4f    4c41    bfc2    000a
              P   R   O   F   E   S   S   I   O   N   A   L   B   ?  nl
    0000017
    $ cat input.txt
    PROFESSIONAL¿
    

    したがって、同じソースデータですが、2つの異なる画面上の表現であり、偶然ではありませんが、2つの異なる出力と同じです。同じデータを少なくとも2つの方法で表示できます。

    それでは、Netezzaに、1回はVARCHAR列に、もう1回はNVARCHAR列にどのように読み込まれるかを見てみましょう。

    create table test_enc_vchar (col1 varchar(50));
    create table test_enc_nvchar (col1 nvarchar(50));
    
    $ nzload -db testdb -df input.txt -t test_enc_vchar -escapechar '\' -ctrlchars
    Load session of table 'TEST_ENC_VCHAR' completed successfully
    $ nzload -db testdb -df input.txt -t test_enc_nvchar -escapechar '\' -ctrlchars
    Load session of table 'TEST_ENC_NVCHAR' completed successfully
    

    エラーなしでロードされたデータ。 nzloadのescapecharオプションを指定している間は注意してください 、入力データのこの特定のサンプルの文字はどれもエスケープする必要がなく、エスケープする必要もありません。

    od を使用したように、SQLExtensionToolkitのrawtohex関数をデータベース内ツールとして使用します。 コマンドラインから。

    select rawtohex(col1) from test_enc_vchar;
               RAWTOHEX
    ------------------------------
     50524F46455353494F4E414CC2BF
    (1 row)
    
    select rawtohex(col1) from test_enc_nvchar;
               RAWTOHEX
    ------------------------------
     50524F46455353494F4E414CC2BF
    (1 row)
    

    この時点で、両方の列に入力ファイルとまったく同じデータがあるように見えます。これまでのところ、とても良いです。

    列を選択するとどうなりますか?記録のために、私はUTF-8のリモート文字セットを使用したPuTTYセッションでこれを行っています。

    select col1 from test_enc_vchar;
          COL1
    ----------------
     PROFESSIONAL¿
    (1 row)
    
    select col1 from test_enc_nvchar;
         COL1
    ---------------
     PROFESSIONAL¿
    (1 row)
    

    バイナリデータは同じですが、表示が異なります。次に、これらの各選択の出力をエコーにコピーすると odにパイプ 、

    $ echo PROFESSIONAL¿ | od -xa
    0000000    5250    464f    5345    4953    4e4f    4c41    82c3    bfc2
              P   R   O   F   E   S   S   I   O   N   A   L   C stx   B   ?
    0000020    000a
             nl
    0000021
    
    $ echo  PROFESSIONAL¿ | od -xa
    0000000    5250    464f    5345    4953    4e4f    4c41    bfc2    000a
              P   R   O   F   E   S   S   I   O   N   A   L   B   ?  nl
    0000017
    

    この出力に基づいて、サンプルデータ(UTF-8も賭けます)をNVARCHAR列ではなくVARCHAR列にロードしていることを賭けます。これ自体は問題ではありませんが、将来的には表示/変換の問題が発生する可能性があります。

    一般的に、UTF-8データをNVARCHAR列にロードする必要があります。




    1. 別のユーザーのテーブルから列名を照会する

    2. 行番号でORA-06512を解決する方法

    3. さまざまな種類のドキュメントを保存する方法

    4. SQLクエリの結果セットに行番号を追加します