The Difference between CHAR, VARCHAR and VARCHAR2

Oracle には文字列を格納するための 3 つのデータ型が用意されています。 – CHAR、VARCHAR、および VARCHAR2 です。 これらは互いにどのように違うのですか?

この記事でその答えを見つけましょう。

まず、最も単純なことを説明します。 VARCHAR と VARCHAR2 は同じものです。 しかし、これは今日のことであり、これは変更される可能性があります。 Oracle のドキュメント 10G Release 2 を参照してください。

VARCHAR データ型は使用しないでください。 代わりに VARCHAR2 データ型を使用します。 VARCHAR データ型は現在 VARCHAR2 と同義ですが、VARCHAR データ型は異なる比較セマンティクスと比較される可変長文字列に使用される独立したデータ型として再定義される予定です。

この記事では、VARCHAR2 は、現在同等である VARCHAR と VARCHAR2 の両方の意味で使用します。

それでは CHAR と VARCHAR2 はどのように違うのでしょうか。

違いは CHAR(n) が常に n バイト長であるということです。 文字列の長さが <n の場合、挿入時に空白のパディングが行われ、n の長さを確保します。 一方、VARCHAR2(n)は1バイトからnバイトの長さである。

例えば、文字列「ORATABLE」をCHAR(20)フィールドとVARCHAR2(20)フィールドに格納するとします。 CHARフィールドは22バイト(先頭の長さで2バイト)使用します。 VARCHAR2 フィールドは 10 バイトのみを使用します (文字列に 8 バイト、先頭の長さに 2 バイト)。

要約すると、CHAR は VARCHAR2 をその最大長にパディングしたものです。

SQL> create table strings 2 (colchar char (20) 3 , colvarchar varchar2 (20));Table created.SQL>SQL> insert into strings 2 (colchar, colvarchar) 3 values 4 ('ORATABLE', 'ORATABLE');1 row created.SQL> -- Define a string variableSQL> var str varchar2(20)SQL> -- Give it a value with length < 20SQL> exec :str := 'ORATABLE'PL/SQL procedure successfully completed.SQL> -- Exact string match with CHARSQL> -- No result found!SQL> select 'found' found_flag 2 from strings 3 where colchar = :str;no rows selectedSQL> -- Padded string match with CHARSQL> -- Now it finds itSQL> select 'found' found_flag 2 from strings 3 where colchar = rpad(:str,20);FOUND-----found

つまり、空白によるパディングは、CHAR 文字列が可変長パラメーターと一致するかどうかに影響を与えることがおわかりいただけると思います。 一致させるためには、値をrpadするか、列をrtrimする必要があります。

VARCHAR2 ではそのような要件はありません。

SQL> -- Exact string match with VARCHAR2SQL> -- Result found!SQL> select 'found' found_flag 2 from strings 3 where colvarchar = :str;FOUND-----found

When should we use CHAR, when VARCHAR2?

常に VARCHAR2 しか使用せず CHAR を無視すれば、人生ははるかにシンプルになるでしょう。 両者の間に違いはありませんが、文字列が常に一定の最大長でない場合、CHAR はより多くのスペースを使用します。 さらに、CHAR はクエリを書く上でより多くの混乱を招きます。

私は CHAR をデータベース列として Y/N タイプの値のみに使用します。 (BOOLEAN 列データ型はありません。覚えていますか?) これは、「フラグ」または「スイッチ」タイプの列のマーカーとして機能しますが、同様に VARCHAR2 であったかもしれません。

概要

Oracle データ型の CHAR、VARCHAR、および VARCHAR2 について考えるとき、次のことを忘れないでください。

  • CHAR と VARCHAR2 は、CHAR はその文字列が最大長になるように空白を入れるという点で異なります。 VARCHAR2はブランクパディングを行わない。
  • 上記の理由により、CHAR列の文字列比較を含むクエリはより注意が必要で、CHARと比較したVARCHAR2はヒットを得るためにRPADEDされる必要がある。
  • コメントを残す

    メールアドレスが公開されることはありません。