2017/12/07
ORACLEの文字列型を格納するデータ型は、CHARとVARCHAR2があります。
この2つの型の違いについて、本記事では解説していきます。
sponsored link
CHAR型は2000バイトまで、VARCHAR2は4000バイトまで
CHAR型は1~2000バイトまでの列長を指定することが出来ます。
一方VARCHAR2型は、1~4000バイトまでの列長を指定することが出来ます。
CHAR型は固定長、VARCHAR2は可変長
CHAR型が固定長であるのに対して、VARCHAR2は可変長という違いがあります。
CHAR型は、列長よりも短い値を入れようとした場合、後ろに半角スペースを補って列長を揃えて挿入されます。
VARCHAR2型は、列長よりも短い値を入れようとした場合でも、そのままの値で挿入されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
-- 項目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の違いについて見てきました。
特に、固定長か可変長という点は大きな違いです。
使い方にも違いがあり、メリットやデメリットがあるので、合わせて覚えておきましょう。