文字列型のCHARとVARCHAR2の違い

ORACLE
20160322-1

ORACLEの文字列型を格納するデータ型は、CHARとVARCHAR2があります。
この2つの型の違いについて、本記事では解説していきます。

スポンサーリンク

CHAR型は2000バイトまで、VARCHAR2は4000バイトまで

CHAR型は1~2000バイトまでの列長を指定することが出来ます。

一方VARCHAR2型は、1~4000バイトまでの列長を指定することが出来ます。

スポンサーリンク

CHAR型は固定長、VARCHAR2は可変長

CHAR型が固定長であるのに対して、VARCHAR2は可変長という違いがあります。

CHAR型は、列長よりも短い値を入れようとした場合、後ろに半角スペースを補って列長を揃えて挿入されます。

VARCHAR2型は、列長よりも短い値を入れようとした場合でも、そのままの値で挿入されます。

-- 項目aはCHAR(5)、項目bはVARCHAR2(5)
INSERT INTO test_table (a,b) VALUES ('1','1');
INSERT INTO test_table (a,b) VALUES ('  2','  2');
INSERT INTO test_table (a,b) VALUES ('    3','    3');
INSERT INTO test_table (a,b) VALUES ('4    ','4    ');
INSERT INTO test_table (a,b) VALUES (' ',' ');
INSERT INTO test_table (a,b) VALUES (NULL,NULL);

COMMIT;

-- 登録後(半角スペースは【_】、NULLは【NULL】と表現)
A     B
----- -----
1____ 1
__2__ __2
____3 ____3
4____ 4____
_____ _
NULL  NULL

CHAR型とVARCHAR2の使い分け

CHAR型は、コードやフラグなど格納データの長さが決まっている項目に使用する事が多いです。
しかし、長さが決まっているならCHAR型もVARCHAR2も差異がないので、どちらを使用してもよいと考えます。

一方VARCHAR2は、名前や住所など格納データの異なるデータの長さが異なる項目に使用する事が多いです。
これにはメリットとデメリットがあります。

メリットは、データの格納効率という点です。
VARCHAR2だと、格納しようとしたデータ長に必要な領域のみを確保します。
一方のCHAR型だと、半角スペースを補ってデータ格納するので必要な領域が膨らみます。
データ長に大幅に満たないデータが多い場合、必要な領域に結構差異が出て、検索スピードに影響が出ることも考えられます。

デメリットは、更新前と比較して長い値で更新しようとし、格納しているブロックに収まらない場合、別のブロックにデータを格納してしまうことがあります。(行移行)
それが多発すると、検索の時間が延びたりといった影響が出ます。
解消するには、断片化の解消作業(export&importなど)が必要です。

また、CHAR型をデータの長さが異なる項目に使用する場合、不足を半角スペースで補ってしまうため、他システムに連携する際に後ろスペースを削る処理が必要となることが考えられます。
その際、元々のデータに後ろスペースが入っていた場合に、区別できないという問題もあります。

それぞれ使用には注意が必要なことがあるので、ぜひ覚えておきましょう。

【おまけ】VARCHAR2の2って何?

VARCHAR2の2ってなんでしょうか。私もずっと疑問に思っていたので、今回少し調べてみました。

どうやら、ORACLE8iの際に、254バイト以下の可変長文字列のVARCHAR型を、4000バイト以下の可変長文字列をVARCHAR2型に拡張したということのようです。

今では、VARCHARで宣言しようとしても、ORACLE内部で自動でVARCHAR2に変換されます。

まとめ

ORACLEの文字列型、CHARとVARCHAR2の違いについて見てきました。
特に、固定長か可変長という点は大きな違いです。
使い方にも違いがあり、メリットやデメリットがあるので、合わせて覚えておきましょう。

タイトルとURLをコピーしました