- 2012-2-18
- Oracle
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言語に慣れてる人の方が詳しいはずなんだが。