Oracle には、よく使われる文字データ型がいくつかありますが、それらの違いを知らないと混乱する可能性があります。 この記事では、それらが何であるか、そしてそれらの違いを学びましょう。
最も頻繁に使用されるOracle文字データ型は、CHARとVARCHAR2です。 VARCHARデータ型もあります。
これらのデータ型がそれぞれどのようなものか見てみましょう。
これは、文字列値がデータベースに格納されるために、パディングされるか、スペース文字が追加されることを意味します。
この例を見てみましょう。
これら3つのデータ型すべてを使用してサンプルテーブルを作成し、いくつかのデータを挿入して、その表示を見てみます。
CREATE TABLE chartest ( char_column CHAR(10), varchar_column VARCHAR(10), varchar2_column VARCHAR2(10));
さて、値を挿入しましょう。
INSERT INTO chartest (char_column)VALUES ('abcde');
さて、値を照会してみましょう。 値、および括弧内の値(スペースがどこにあるかを見るため)を照会し、長さをチェックし、そしていくつかの統計情報を見るためにDUMPを実行します。
SELECT char_column,'(' || char_column || ')' AS col_full,LENGTH(char_column) AS col_length,DUMP(char_column) AS col_dumpFROM chartest;
Result:
CHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
abcde | (abcde ) | 10 |
ご覧のように、abcdeの値は長さが10になるように保存時にスペースでパディングされています。 DUMP関数の出力では、格納される各文字のコードを見ることができます。 32 文字目はスペースです。
VARCHAR データ型
VARCHAR データ型は ANSI 標準データ型で、そのため Oracle に含まれています。
ただし、現時点では VARCHAR2 データ型と同じです。
ANSI標準では、VARCHARは本来そうであるはずの NULL と空のストリングを区別できるように Oracle に含まれています。 しかし、Oracle では、それは行われません。 VARCHAR2 のように、空の文字列は NULL 値として扱われます。
つまり、Oracle では、VARCHAR と VARCHAR2 の違いは何もないのです。 VARCHAR データ型は将来の Oracle 機能のために予約されており、変更される可能性があるため、使用しないほうがよいでしょう。
例を見てみましょう。 先ほどと同じテーブルを使い、いくつかのデータを挿入します。
INSERT INTO chartest (varchar_column)VALUES ('fghij');
さて、このデータを選択してみましょう。
SELECT varchar_column,'(' || varchar_column || ')' AS col_full,LENGTH(varchar_column) AS col_length,DUMP(varchar_column) AS col_dumpFROM chartest;
結果です。
VARCHAR_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
fghij | (fghij) | 5 |
括弧内の値にスペースが入っていないことがわかりますが、これはVARCHAR2やVARCHARがスペースを追加しないためです(これについては後ほど説明します)。 また、長さは5文字です。
VARCHAR2 データ型
VARCHAR2データ型は、可変長の文字列を格納するために使用されます。 これは、最大サイズを定義し、カラムに挿入する文字列は提供されたとおりに保存されることを意味します。 CHARデータ型のように、スペースが追加されることはありません。
VARCHAR2データ型の最大長は4000バイトです。 しかし、Oracle 12cの新機能の1つとして32767バイトに引き上げられました。
例を見てみましょう。
INSERT INTO chartest (varchar2_column)VALUES ('klmno');
さて、結果をクエリしてみましょう。
SELECT varchar2_column,'(' || varchar2_column || ')' AS col_full,LENGTH(varchar2_column) AS col_length,DUMP(varchar2_column) AS col_dumpFROM chartest;
結果を表示します。
VARCHAR2_COLUMN | COL_FULL | COL_LENGTH | COL_DUMP |
klmno | (klmno) | 5 |
出力がVARCHARの例と同じであることが分かります。 スペースは追加されていませんし、長さも同じです。 入力文字列が異なるため、ASCIIコードの文字が異なるだけです。
違い。 CHAR vs VARCHAR vs VARCHAR2
これら3つのデータ型の違いを見てみましょう。
- VARCHAR と VARCHAR2 はまったく同じものです。 CHAR は異なります。
- CHAR の最大サイズは 2000 バイト、VARCHAR/VARCHAR2 の最大サイズは 4000 バイト (Oracle 12c では 32,767)
- CHAR にはサイズの指定は必要なく、デフォルトは 1 です。 VARCHAR/VARCHAR2 列ではサイズを指定する必要があります。
- CHAR は列の長さに一致するように文字列の右側にスペースをパッドしますが、VARCHAR/VARCHAR2 はそうではありません。 これらのデータ型で性能に差はありません。 CHAR は VARCHAR2 よりも速くなく、VARCHAR2 は CHAR よりも速くありません。
Tom Kyte が AskTom に投稿し、この技術的な詳細について説明しています。 また、彼は、ブランク パディングされた VARCHAR2 値は CHAR 値とまったく同じであると説明しています。
このことについて少し考えてみてください。
データ型はほとんど同じです。
では、これらのデータ型のどちらを使用すべきでしょうか。
Tom Kyte が彼のフォーラムや彼の本で議論したように(そして私も同意する)、CHAR データ型を決して使用しない理由はありません。 VARCHAR2 は CHAR が考慮されるすべての状況をカバーできます。VARCHAR2(1) と同じである CHAR(1) でさえも。 Oracle はまだこの区別を実装していないので、現時点では、VARCHAR と VARCHAR2 は同じです。 Oracle が将来 VARCHAR を変更し、あなたのコードが VARCHAR.
を使用した場合、コードが壊れることを避けたいので、VARCHAR2 を使用するほうが安全です。