OracleDBにおける日本語の文字列格納用カラムのデータ型について


OracleDB(11g)を利用することになり、日本語文字列を格納するカラムのデータ型をどうすればよいか悩んで調べたので、自身の備忘録として。

データ型の選択肢

例えば20文字の文字列を格納するカラムとした場合

  • VARCHAR2(20 CHAR)
  • NVARCHAR2(20)

※ VARCHAR型の CHAR は、BYTE数カウントではなく文字数カウントであるという指定。

検討要素

1. Charset

データ型 Charset
VARCHAR2 DatabaseのCharset依存
NVARCHAR2 Unicodeのみ(Oracleを含む大抵のDBではUTF-16でエンコードする)

システム要件として、使用するキャラセットに制限がある場合はそれに従うのが吉。

2. サロゲートペア文字

データ型 サロゲートペア1文字の扱い
VARCHAR2 VARCHAR(1)に格納可能
NVARCHAR2 2文字として扱われるため、NVARCHAR(1)には格納できない

人名など(他は思いつかないが)で、一般的ではない漢字であってもそのまま扱わないといけない場合は、VARCHAR2にしておくほうが吉。
一般的な漢字のみを格納する前提であればどちらでも。

3. バイト数

データ型 1文字のバイト数の扱い
VARCHAR2 1~4バイト(一般的な全角文字は3バイト)
NVARCHAR2 2または4バイト(一般的な全角文字は2バイト)

全角文字が多く格納される場合は、NVARCHAR2の方がバイト数が少なくなる。
半角文字の数値やアルファベットが多く格納される場合は、VARCHAR2の方がバイト数が少なくなる。
DB容量のシビアな問題があれば考慮すべきだが、そこまでギリギリの環境自体がそもそも良くない。

参考URL