ホームページ  >  記事  >  データベース  >  MySQL における CHAR と VARCHAR の違い

MySQL における CHAR と VARCHAR の違い

Guanhui
Guanhui転載
2020-04-30 11:07:532897ブラウズ

前述

VARCHAR と CHAR は 2 つの主要な文字列型です。残念ながら、これらの値がディスクやメモリにどのように保存されるかを正確に説明することは、ストレージ エンジンの特定の実装に依存するため困難です。以下の説明では、使用されるストレージ エンジンが InnoDB または MyISAM であることを前提としています。これら 2 つのストレージ エンジンを使用していない場合は、使用しているストレージ エンジンのドキュメントを参照してください。

まず、VARCHAR 値と CHAR 値が通常どのようにディスクに保存されるかを見てみましょう。ストレージ エンジンが CHAR または VARCHAR 値を格納する方法は、メモリ内とディスク上で異なる場合があるため、MySQL サーバーによってストレージ エンジンから読み取られる値は、別のストレージ形式に変換する必要がある場合があることに注意してください。

VARCHAR 型

VARCHAR 型は、可変長文字列の格納に使用され、最も一般的な文字列データ型です。必要なスペースのみを使用するため、固定長タイプよりもスペース効率が高くなります (たとえば、文字列が短いほど、使用するスペースが少なくなります)。例外として、MySQL テーブルが ROW_FORMAT=FIXED で作成されている場合、各行は固定長ストレージを使用するため、スペースが無駄になります。

VARCHAR では、文字列の長さを記録するために 1 バイトまたは 2 バイトの追加バイトが必要です。列の最大長が 255 バイト以下の場合、それを表すために 1 バイトのみが使用され、それ以外の場合は 2 バイトが使用されます。使用済み。 latin1 文字セットが使用されていると仮定すると、VARCHAR(10) 列には 11 バイトの記憶域スペースが必要です。 VARCHAR(1000) 列には、長さ情報を格納するために 2 バイトが必要なため、1002 バイトが必要です。

VARCHAR はストレージ領域を節約するため、パフォーマンスも向上します。ただし、行は可変長であるため、UPDATE 中に行が元の行より長くなる可能性があり、追加の作業が必要になります。行が占めるスペースが増加し、ページに保存するスペースがなくなった場合、ストレージ エンジンごとにこの状況の処理方法が異なります。たとえば、MyISAM は行をさまざまなフラグメントに分割して保存しますが、InnoDB は行がページに収まるようにページを分割する必要があります。他のストレージ エンジンの中には、元のデータの場所にあるデータを決して更新しないものもあります。

VARCHAR が適用される状況

次の状況では VARCHAR を適用することが適切です。

文字列列の最大長が、文字列列の最大長よりもはるかに長いです。平均長

列はめったに更新されないため、断片化は問題になりません

#UTF-8 などの複雑な文字セットが使用され、各文字は異なるバイト数を使用して保存されます

CHAR 型

CHAR 型は固定長です。MySQL は、定義された文字列長に従って常に十分なスペースを割り当てます。 CHAR 値を格納する場合、MySQL は末尾のスペースをすべて削除します。比較を容易にするために、CHAR 値には必要に応じてスペースが埋め込まれます。

CHAR は、非常に短い文字列、またはすべての値が同じ長さに近い文字列を格納するのに適しています。たとえば、CHAR は固定長値であるため、パスワードの MD5 値を格納するのに最適です。頻繁に変更されるデータの場合、固定長 CHAR 型は断片化が起こりにくいため、VARCHAR よりも CHAR の方が適しています。また、非常に短い列の場合、CHAR は VARCHAR よりも記憶域スペース効率が高くなります。たとえば、CHAR(1) は Y 値と N 値のみを格納するために使用されます。シングルバイト文字セットを使用する場合は 1 バイトだけが必要ですが、VARCHAR(1) にはレコードに余分なバイトがあるため、2 バイトが必要です。長さ。 。

テスト

次は、CHAR と VARCHAR の動作の違いを示す例です。まず、CHAR(10) フィールドを 1 つだけ含むテーブルを作成します。

CREATE TABLE char_test
(
    char_col CHAR(10)
);
 
INSERT INTO char_test 
VALUES
    ('string1').
    ('  string2').
    ('string3  ');

これらの値を取得すると、string3 の末尾のスペースが切り捨てられていることがわかります。

SELECT CONCAT("'", char_col, "'")
FROM char_test;

実行結果:

MySQL における CHAR と VARCHAR の違い

VARCHAR(10) フィールドを使用して同じ値を格納すると、次の結果が得られます:

CREATE TABLE varchar_test
(
    varchar_col VARCHAR(10)
);
 
INSERT INTO varchar_test 
VALUES
    ('string1').
    ('  string2').
    ('string3  ');
 
SELECT CONCAT("'", varchar_col, "'")
FROM varchar_test;

実行結果

MySQL における CHAR と VARCHAR の違い

VARCHAR(5)とVARCHAR(200)の違い

VARCHAR( 5) と VARCHAR(200) ) を使用して 'hello' を保存すると、この 2 つのスペース オーバーヘッドが同じであることがわかります。それでは、VARCHAR の長さを常に大きく保つことができるのでしょうか?短い列を使用することに利点はありますか?

事実には大きな利点があることが証明されています。 MySQL は通常、内部値を保持するために固定サイズのメモリ ブロックを割り当てるため、カラムが長いほど多くのメモリを消費します。これは、並べ替えや操作にメモリ内の一時テーブルを使用する場合に特に問題になります。ディスク一時テーブルを使用して並べ替える場合も同様に問題が発生します。

したがって、最善の戦略は、本当に必要なスペースのみを割り当てることです。

概要

文字列型フィールドの型を選択して、VARCHAR と CHAR のどちらを選択するかを決定するときは、次の点を考慮できます。

フィールド データ セットの平均長と最大長の間に非常に小さな差がありますか? 差が非常に小さい場合は、CHAR 型が優先されます。そうでない場合は、VARCHAR 型が考慮されます。

フィールドに MD5 以降のハッシュ値または固定長値が格納されている場合は、CHAR 型が推奨されます。

フィールドを頻繁に更新する必要がある場合は、CHAR 型が優先されます。CHAR 型は固定長であるため、断片化が起こりにくいです。

性別などの非常に小さな情報を格納するフィールド値の場合は、文字列長情報を格納するために VARCHAR 型が追加のバイトを占有するため、CHAR 型が推奨されます。

つまり、CHAR 型を選択できる場合、または領域消費が影響要因の焦点では​​ない場合は、CHAR 型を選択するようにしてください。他の側面では、CHAR 型の方がより多くの機能や機能を備えているためです。少ない利点。スペース消費が大きな影響を与える要因となる場合は、VARCHAR 型の使用を検討します。

推奨チュートリアル: 「Mysql チュートリアル

以上がMySQL における CHAR と VARCHAR の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。