web-dev-qa-db-ja.com

Oracleのvarcharとvarchar2の違いは何ですか?

Varcharとvarchar2の違いは何ですか?

232
hrishi

今のところ、それらは同義語です。

VARCHARは、Oracleで規定されているように、将来的にNULLと空の文字列との区別をサポートするためにANSIによって予約されています。

VARCHAR2NULLと空の文字列を区別しませんし、決して区別しません。

空の文字列とNULLが同じものであることに頼っているなら、VARCHAR2を使うべきです。

301
Quassnoi

現在、VARCHARはVARCHAR2とまったく同じように動作します。ただし、タイプVARCHARは将来の使用のために予約されているので使用しないでください

撮影元: CHAR、VARCHAR、VARCHAR2の違い

36
Brian

最新の安定版Oracle製品バージョン12.2から引用したものです。 データ型

主な違いは、VARCHAR2internal data typeで、VARCHARexternal 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はまだVARCHARVARCHAR2pseudotypeとして扱うことを提案しています。 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

21
sandman

いくつかの実験(下記参照)の後、2017年9月現在、 受け入れられた答え :に記載されている機能に関して何も変わっていないことを確認できます。

  1. Oracle 11g用Rextesterデモ: 空の文字列は、NULLVARCHAR2の両方にVARCHARsとして挿入されます。
  2. Oracle 12c用のLiveSQLデモ: 同じ結果です。

これら2つのキーワードの歴史的な理由は、 別の質問に対する答え でよく説明されています。

2
Steve Chambers

現在、それらは同じです。しかし以前

  1. ネットのどこかで、私はそれを読みました、

ANSI規格で規定されているように、VARCHARは将来的にNULLと空の文字列の区別をサポートするためにOracleによって予約されています。

VARCHAR2NULLと空の文字列を区別しませんし、決して区別しません。

  1. また、

Emp_name varchar(10) - 10桁未満の値を入力した場合、残りのスペースは削除できません。合計10個のスペースを使用しました。

Emp_name varchar2(10) - 10桁未満の値を入力した場合、残りのスペースは自動的に削除されます

1
Ramkumar P