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


回答:


337

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

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

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

空の文字列に依存しNULLて同じものである場合は、を使用する必要がありますVARCHAR2


40
以前にその理論的根拠を聞いたことがない、それは便利です。ありがとう。記録としては、Oracleの主な文字タイプが「varchar2」であることはまだまったくばかげています。それはひどいクラッジとして他の誰かを襲っていませんか?プログラミングの学習の最初の1週間で、どのように問題を解決したのかと思われます。
Ian Varley、2010年

7
@Ian:メインタイプはVARCHAR2、現在のように動作するタイプがないためVARCHARです。実際、VARCHAR適切に実装されるまでは使用すべきではありません。
Quassnoi、2010年

11
ありがとう、@ Quassnoi。だから私は愚かな部分は、Oracleが他のすべてのデータベースのような適切なVARCHARを持っていないということですか?ここで何か愚かなことが起こっていると確信しています... :)
Ian Varley

11
@Ian:Oracleが開発されていたとき、標準はありませんでした。標準が登場する頃には、レガシーアプリの負担がすでにありました。私たちは皆、それがどのように起こるかを知っています。
Quassnoi

5
申し訳ありませんが、私が返信していた間違ったコメントを書いたのは実際には@UnKnownでし。その事実where x is NULLから戻っ異なる結果where x = ''ではないことを意味NULLし、''別の任意の方法です。異なる動作は、=オペレーターによるものです。
Dan Lenski 2017

38

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

取得元:CHAR、VARCHAR、VARCHAR2の違い


@PhilipRego VARCHARは使用しないでください。私はそれを編集しました
bugybunny

29

最新の安定したOracle製品バージョン12.2から取得: データ型

主な違いは、つまりVARCHAR2ある内部データ・タイプVARCHARなる外部データ型。したがって、内部データ型と外部データ型の違いを理解する必要があります...

データベース内では、値はテーブルの列に格納されます。内部的には、Oracleは内部データ型と呼ばれる特定の形式でデータを表します。

一般に、OCI(Oracle Call Interface)アプリケーションは、データの内部データ型表現では機能しませんが、記述された言語で事前定義されているホスト言語データ型では機能しません。OCIクライアントアプリケーションとデータベーステーブルの間でデータが転送されると、OCIライブラリは内部データ型と外部データ型の間でデータを変換します。

外部型は、独自のデータ形式の代わりにホスト言語の型を操作できるようにすることで、プログラマーに便利を提供します。OCIは、OracleデータベースとOCIアプリケーション間でデータを転送するときに、さまざまなデータ型変換を実行できます。Oracle内部データ型よりも多くのOCI外部データ型があります。

VARCHAR2データ型は、4000バイトの最大長を持つ文字の可変長の文字列です。init.oraパラメータmax_string_sizeがデフォルトの場合、aの最大長はVARCHAR24000バイトです。init.oraパラメータmax_string_size = extendedの場合、aの最大長はVARCHAR232767バイトになります。

VARCHARデータ型は可変長の文字列を格納します。最初の2バイトには文字列の長さが含まれ、残りのバイトには文字列が含まれます。バインドまたは定義呼び出しで指定された文字列の長さには2バイトの長さが含まれている必要があるため、VARCHAR送受信できる最大の文字列は65535バイトではなく65533バイトです。

12.2データベースで簡単なテストは、ようことを示唆している内部データ型、Oracleはまだ扱いVARCHARとしてのためにVARCHAR2SYNONYMOracleでは実際のオブジェクトタイプではありません。

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)

VARCHARProC / C ++プリコンパイラオプションには、いくつかの影響もあります。興味のあるプログラマー向けのリンクは次のとおりです。Pro* C / C ++ Programmer's Guide


1
つまり、これはVARCHARまだ扱い'' == nullますか?

2
はい。上記の内部型と外部型の説明は、OCIリファレンスからのものです。12.2 SQL言語リファレンスはまだそれが常にVARCHARのために持っていた声明「を使用していない」と同じを運びます。
ウィリアムロバートソン

これが、OCIの違いについて説明した理由です。それ以外の場合は、将来の使用のために、またはマルチバイトUTF8などの文字セットを示唆する「可変長」と言われるようにかなり予約されています...
sandman

1
VARCHARとして宣言された値はVARCHAR2としてデータベースに格納されますが、VARCHARの最大長(65533バイト)はVARCHAR2の最大長(32767バイト)より大きいことを示しました。データベースはこれをどのように処理しますか?
Piotr Dobrogost 2018年

IIRC、ずっと前(たぶんOracle 6?)VARCHARタイプがスペースのパディングに対して正しく動作しなかった-またはスペースを切り捨てていたのか?AAR、VARCHAR2が答えでした。OracleはVARCHARを戻すと言っていましたが、空の文字列がNULLでない場合、歯がぎざぎざになるでしょう。
JMD

2

いくつかの実験(下記を参照)の後、2017年9月の時点で、承認された回答に記載されている機能に関して何も変更されていないことを確認できます

  1. Oracleの11gのRextesterデモ: 空の文字列は次のように挿入されているNULL両方のためのVARCHARVARCHAR2
  2. Oracle 12cのLiveSQLデモ:同じ結果。

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


0
  1. VARCHARは最大2000バイトの文字を格納でき、VARCHAR2は最大4000バイトの文字を格納できます。

  2. データ型をVARCHARとして宣言すると、NULL値用のスペースが占有されます。VARCHAR2データ型の場合、NULL値用の領域は使用されません。例えば、

    name varchar(10)

名前が「Ravi__」であっても6バイトのメモリを予約しますが、

name varchar2(10) 

入力文字列の長さに応じてスペースを予約します。たとえば、「Ravi__」用の4バイトのメモリ。

ここで、_はNULLを表します。

注:varcharはnull値用のスペースを予約し、varchar2はnull値用のスペースを予約しません。


2
この回答はと混同VARCHARしてCHARいると思います。
Jon Heller

0

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

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

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

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

  1. また、

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

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


最近この投稿に遭遇しました。間違っていることに注意してください。次のコマンドを実行し、両方のフィールドが3つの文字になります:create table deleteme_table(v varchar(10), v2 varchar2(10)); insert into deleteme_table (v, v2) values ('abc','abc'); select v, length(v), v2, length(v2) from deleteme_table;
ブライアン・リーチ

-1

VARCHARはVARCHAR2の同義語です。ただし、Oracleはそのセマンティクスを将来変更する可能性があるため、VARCHARを使用しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.