web-dev-qa-db-ja.com

Varchar2とcharの主な違いは何ですか

テーブルの作成:

CREATE TABLE test (
charcol    CHAR(10),
varcharcol VARCHAR2(10));

SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test;

結果:

LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
             10                  1 

Varchar2とcharの違いを教えてください。いつ両方を使用しますか?

20
ram12393

違いを示す簡単な例:

SELECT 
    '"'||CAST('abc' AS VARCHAR2(10))||'"', 
    '"'||CAST('abc' AS CHAR(10))||'"' 
FROM dual;


'"'||CAST('ABC'ASVARCHAR2(10))||'"' '"'||CAST('ABC'ASCHAR(10))||'"'
----------------------------------- -------------------------------
"abc"                               "abc       "                   
1 row selected.

CHARは、文字の長さが常に固定されている式に役立ちます。米国州の郵便番号、たとえば、CA、NY、FL、TX

19

これは古いスレッドですが、 'Oracle char vs varchar2'のGoogle検索のトップになりましたが、すでにいくつかの答えが正しく記述されていますcharの動作は、次の2つの特定の状況を除いて使用しないでください。

  1. 固定長のファイルまたはレポートを作成しており、charにnull以外の値を割り当てると、rpad()式をコーディングする必要がなくなります。たとえば、firstnamelastnameの両方がchar(20)として定義されている場合、_firstname || lastname_はrpad(firstname,20) || rpad(lastname,20)を記述するより短い方法です。
  2. 明示的な空の文字列_''_とnullを区別する必要があります。通常、これらはOracleでは同じものですが、char値に_''_を割り当てると、その空白埋め動作がトリガーされますが、nullはそうではないため、違いを伝えることが重要な場合、そして、私はそれがそうなる理由を本当に考えることができません、そしてあなたはそれをする方法を持っています。

実際にはcharを使用する理由はありません何らかの長さが固定されているからです(例:_Y/N_フラグまたは_'USD'_などのISO通貨コード)。それは効率的ではなく、スペースを節約しません(_varchar2_の神話上の長さインジケータはありません、charには空白のパディングオーバーヘッドがあります)、そしてより短い値を入力する人を止めません。 (char(3)通貨列に_'ZZ'_と入力すると、単に_'ZZ '_として保存されます。)かつて依存していたOracleの一部の旧バージョンとも後方互換性がありません。それはなかったからです。

そして、(ベストプラクティスに従って)_sales.currency%type_のようなものを使用して変数宣言を固定する可能性があるため、感染が広がる可能性があります。これで、あなたの_l_sale_currency_変数はステルスcharになり、短い値(または_''_)に対して見えないように空白が埋め込まれ、_l_sale_currency_がそうでないバグを隠します_l_refund_currency_を両方に割り当てた場合でも、_'ZZ'_と等しくなります。

CHARは、ANSI互換性の理由から、Oracle 6で導入されました。おそらく、どのデータベース製品を購入するかを決定する潜在的な顧客がおり、ANSI互換性がチェックリストにある(または以前使用されていた)、およびCHAR空白埋めはANSI標準で定義されているため、Oracleはそれを提供する必要があります。実際に使用することは想定されていません。

19

多くの誤った情報に関する混乱を避けるためです。ここにパフォーマンスを含む違いに関するいくつかの情報があります

参照: https://asktom.Oracle.com/pls/asktom/f?p=100:11:0:::::P11_QUESTION_ID:2668391900346844476

Charは、最大長になるまで空白が埋め込まれたVARCHAR2にすぎないため、つまり、下の列XとYの違いです。

テーブルt(x varchar2(30)、y char(30))を作成します; t(x、y)値に挿入(rpad( 'a'、 ''、30)、 'a');

絶対に何もありません。以下の列XとYの違いを考えると:

t(x、y)値に挿入( 'a'、 'a')

xは3バイト(ヌルインジケータ、先行バイト長、「a」の1バイト)を消費し、Yは32バイト(ヌルインジケータ、先行バイト長、「a」の30バイト)を消費します

ええと、varchar2は多少「有利なパフォーマンスで」になるでしょう。 NOT AT ALL char(30)が常に30バイトであることを助けます-私たちにとっては、単に最大長まで空白で埋められたvarchar2です。処理を助けます-ゼロ、zilch、zippo。

「最大50%高速です」と言う人がいるときはいつでも、それは-例、科学、事実、それを裏付けるストーリーはありません-ただ大声で笑いながら動き続けてください。

そのページには、他にも「構成されたもの」があります。例えば:

"CHARでは、すべての文字列が互いに指定されたa 指定位置に格納されるため、検索が高速になり、システムは/文字列の末尾を検索します。一方、VARCHARでは、システムはto まず文字列の末尾を見つけてから検索に進みます。 "

FALSE:charは単なるvarchar2の空白埋めです-文字列は「互いに指定された位置に」格納されません。文字列の末尾を検索します。先頭のバイト長を使用して状況を把握します。

4
Anddo

[〜#〜] char [〜#〜] typeは固定サイズであるため、10バイトと言うと、データベースに常に10バイトを格納し、格納するかどうかは関係ありません任意のテキストまたは空の10バイト

VARCHAR2サイズは、データベースに実際に保存するバイト数によって異なります。指定する数値は、格納できる最大バイト数です(ただし、1バイトが最小です)

固定長の文字列を扱うときは、CHARを使用する必要があります(保存する文字列の正確な長さを事前に知っている)-データベースは正確な長さを知っているので、それをより良く、より速く操作できます

格納された文字列の正確な長さがわからない場合は、VARCHAR2を使用する必要があります。

両方を使用する状況は次のとおりです。

name VARCHAR2(255),
Zip_code CHAR(5) --if your users have only 5 place Zip codes
4
Wolf

[〜#〜] char [〜#〜]

CHARは、固定長の文字列を格納するために使用する必要があります。文字列値は、ディスクに保存される前にスペース/空白が埋め込まれます。このタイプが可変長文字列の格納に使用される場合、多くのディスク容量を無駄にします。

VARCHAR2

VARCHAR2は、可変長の文字列を格納するために使用されます。文字列値の長さは、値自体とともにディスクに保存されます。

そして

At what times we use both?

そのすべてはあなたの要件に依存します。

2
Shree

[〜#〜] char [〜#〜]は、固定長の文字列の保存に使用されます。このタイプを使用してバリベールの長さの文字列を保存すると、多くのディスク容量が無駄になります。

VARCHAR2は、可変長文字列を格納するために使用されます。

いつ両方を使用しますか?

これは要件によって異なる場合があります。

編集:-

サイズが10の学生名列がある場合、例を使用してこれを理解しましょう。 sname CHAR(10)および列値_'RAMA'_が挿入されると、値の右側に6個の空のスペースが挿入されます。これがVARCHAR列の場合。 sname VARCHAR2(10).その後、Varcharは可能な10個のうち4個のスペースを取り、次の6個を他の使用のために解放します。

0
Rahul Tripathi