Oracle CREATE TABLE文 カラム定義の BYTE / CHAR
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バイトに達した時点でエラーになるということがわかりました。