Varcharとvarchar2の違いは何ですか?
今のところ、それらは同義語です。
VARCHAR
は、Oracle
で規定されているように、将来的にNULL
と空の文字列との区別をサポートするためにANSI
によって予約されています。
VARCHAR2
はNULL
と空の文字列を区別しませんし、決して区別しません。
空の文字列とNULL
が同じものであることに頼っているなら、VARCHAR2
を使うべきです。
現在、VARCHARはVARCHAR2とまったく同じように動作します。ただし、タイプVARCHAR
は将来の使用のために予約されているので使用しないでください
最新の安定版Oracle製品バージョン12.2から引用したものです。 データ型
主な違いは、VARCHAR2
はinternal data typeで、VARCHAR
はexternal data typeです。したがって、内部データ型と外部データ型の違いを理解する必要があります。
データベース内では、値はテーブルの列に格納されます。内部的には、Oracleはinternal data typesとして知られる特定の形式でデータを表します。
一般に、OCI(Oracle Call Interface)アプリケーションは、データの内部データ型表現では機能せず、作成された言語によって事前定義されているホスト言語データ型では機能します。データがOCIクライアント・アプリケーションとデータベース表の間で転送されると、OCIライブラリは内部データ型と外部データ型の間でデータを変換します。
外部型は、独自のデータ形式の代わりにホスト言語型を扱うことを可能にすることによって、プログラマに便利さを提供します。 OCIは、OracleデータベースとOCIアプリケーション間でデータを転送するときに、広範囲のデータ型変換を実行できます。 Oracleの内部データ型よりも多くのOCI外部データ型があります。
VARCHAR2
データ型は、最大長4000バイトの可変長文字列です。 init.oraパラメータmax_string_sizeがデフォルトの場合、VARCHAR2
の最大長は4000バイトになります。 init.oraパラメータmax_string_size = extendedの場合、VARCHAR2
の最大長は32767バイトです。
VARCHAR
データ型は、さまざまな長さの文字列を格納します。最初の2バイトは文字列の長さを含み、残りのバイトは文字列を含みます。バインド呼び出しまたは定義呼び出しで指定された長さのストリングには2バイトの長さが含まれている必要があるため、送受信できる最大のVARCHAR
ストリングは、65535バイトではなく65533バイトです。
12.2データベースでの簡単なテストでは、内部データ型として、OracleはまだVARCHAR
をVARCHAR2
のpseudotypeとして扱うことを提案しています。 Oracleの実際のオブジェクト型であるSYNONYM
ではありません。
SQL> select substr(banner,1,80) from v$version where rownum=1;
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> create table test (my_char varchar(20));
Table created.
SQL> desc test
Name Null? Type
MY_CHAR VARCHAR2(20)
ProC/C++プリコンパイラオプションに対するVARCHAR
の影響もいくつかあります。興味のあるプログラマのために、リンクは次の場所にあります。 Pro * C/C++ Programmer's Guide
いくつかの実験(下記参照)の後、2017年9月現在、 受け入れられた答え :に記載されている機能に関して何も変わっていないことを確認できます。
NULL
とVARCHAR2
の両方にVARCHAR
sとして挿入されます。これら2つのキーワードの歴史的な理由は、 別の質問に対する答え でよく説明されています。
現在、それらは同じです。しかし以前
ANSI規格で規定されているように、VARCHAR
は将来的にNULL
と空の文字列の区別をサポートするためにOracleによって予約されています。
VARCHAR2
はNULL
と空の文字列を区別しませんし、決して区別しません。
Emp_name varchar(10)
- 10桁未満の値を入力した場合、残りのスペースは削除できません。合計10個のスペースを使用しました。
Emp_name varchar2(10)
- 10桁未満の値を入力した場合、残りのスペースは自動的に削除されます