CREATE TABLE による Oracle DBMS のテーブル作成で、文字列カラムの定義に指定するサイズをバイトにするか、文字数にするかを指定できることを知りました。今まではデフォルトで行っていたのでバイト数指定でした。BYTE指定とCHAR指定の違いを簡単に整理してみました。(Oracle 11g)

以下の様にカラムサイズ指定をしてテーブルが作成できます。

CREATE TABLE TEST (
  A5 VARCHAR2(5),
  B5 VARCHAR2(5 BYTE),
  C5 VARCHAR2(5 CHAR)
);

A5列がサイズの単位を省略した書き方で、BYTEを指定したのと等価。
B5列は5バイトの文字列を最大長とするカラム定義で、UTF-8のDBに’ああ’と入れようものなら、UTF-8の’ああ’=6バイトであるため5バイトをオーバーして「ORA-12899: 列”SYS”.”TEST”.”B5″の値が大きすぎます(実際: 6、最大: 5)」とエラーが出力。半角なら’ABCDE’の5文字(=5バイト)までOK。

C5列は5文字の文字列を最大長とするカラム定義なので、’ああ’は問題なく登録でき、’あいうえお’ の5文字までは問題なく挿入できますが、’あいうえおか’の6文字だとエラーが発生いします。「ORA-12899: 列”SYS”.”TEST”.”C5″の値が大きすぎます(実際: 6、最大: 5)」と出力されます。

VARCHAR2の最大長が4000 Byteであることを考えると、“4000 CHAR” の定義は可能なのかと確認してみました。以下2種類のCREATE TABLEを行いました。

  CREATE TABLE TEST_B (
    B4000 VARCHAR2(4000 BYTE)
  );
  表が作成されました。

  CREATE TABLE TEST_C (
    C4000 VARCHAR2(4000 CHAR)
  );
  表が作成されました。

どちらも成功していますが、TEST_Cの方に4000バイトを超える文字列を挿入しようとすると「ORA-01704: 文字列リテラルが長すぎます」とエラーがでます。“4000 CHAR” のカラム定義はできるが、結局4000文字に満たなくても4000バイトに達した時点でエラーになるということがわかりました。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です