CHAR と NCHAR の違い

  • デル株式会社
  • NCHARとCHARの違いってご存知でしょうか?
    意外と知らない人が多いのでちょっと解説。
    今日現場で

    NCHAR って半角文字入るんだっけ?』って言われて
    ビクーリしまして、いろいろと事情聴取してみた所、
    多くの人は以下のようにお考えです。

        CHAR・・・半角文字を扱う
        NCHAR・・・全角文字を扱う
        駆け出しの新人ならこの認識でも構いませんが、厳密には違う事を知っておきましょう。
        以下のテストをしてみます。
        CREATE TABLE YOSHIDA_TEST
        (
            CHAR_TEST   CHAR(3),
            NCHAR_TEST  NCHAR(1)
        );
        INSERT INTO YOSHIDA_TEST VALUES ( ‘あ’ , ‘あ’ );
        INSERT INTO YOSHIDA_TEST VALUES ( ‘A’ , ‘A’ );
        SELECT DUMP(CHAR_TEST,16),DUMP(NCHAR_TEST,16) FROM YOSHIDA_TEST;
        DUMP(CHAR_TEST,16)
        ————————–
        DUMP(NCHAR_TEST,16)
        ————————–
        Typ=96 Len=3: e3,81,82
        Typ=96 Len=2: 30,42
        Typ=96 Len=3: 41,20,20
        Typ=96 Len=2: 0,41
        select * from YOSHIDA_TEST WHERE CHAR_TEST = NCHAR_TEST;
        CHAR_T NC
        —— —
        あ     あ
        A      A
        ■解説■
        CHAR型はOracleの内部文字コードで文字を持ち、
        ( Oracleのプラットフォームで ASCII,EUC,EBCDIC の文字コードが変わります )
        NCHAR型はUNICODEで持つ。
        単純に全角、半角って訳ではありません。
        なので、例えば、’A’ って文字でも、
        NCHAR では、 0x0041 で、 CHAR では、 0x41 な訳です。
        ちなみにCHAR で全角文字を使う時、 バイト数+1バイトを考えないと
        エラーになります。
        全角の場合、無条件に頭に『0xe3』って文字コードが付与されるからです。
        (0xE3が何を意味してるのかはよくわかりません。)
        しかし、WHERE で条件に合致するのは、Oracle が内部で文字コードを
        変換しているから。(VCで言うところの WideCharToMultiByte が走ってるのかな。)
        Oracleが大文字小文字を区別しなかったりするのと
        同様です。
        マルチプラットファームで全角コード扱う場合は、CHARよりも断然NCHAR使う方が
        勝手がいいのはこの為かな。。。(UTF-8 や UTF-16の文字コードは OS に依存しないはず。)
        ちなみに今の現場の文字コードは特殊フォントを使っています。
        フォントって奥が深い・・・と思う今日この頃。
        って言うか、この辺って ネイティブなC言語に慣れてる人の方が詳しいはずなんだが。

    関連記事

    ページ上部へ戻る