MySQL における varchar 型と char 型の違い

MySQL における varchar 型と char 型の違い

前述の

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

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

VARCHAR型

VARCHAR 型は可変長文字列を格納するために使用され、最も一般的な文字列データ型です。必要なスペースのみを使用するため、固定長型よりもスペース効率が高くなります (たとえば、文字列が短いほど、使用するスペースが少なくなります)。例外が 1 つあります。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 型は断片化される可能性が低いため、頻繁に変更されるデータの場合、CHAR は VARCHAR よりも適しています。非常に短い列の場合、CHAR は VARCHAR よりもストレージ スペースの効率も高くなります。たとえば、YとNのみを含む値をCHAR(1)で格納する場合、シングルバイト文字セットであれば1バイトしか必要ありませんが、VARCHAR(1)ではレコード長に1バイト余分にあるため2バイト必要になります。

テスト

次の例は、CHAR と VARCHAR の動作の違いを示しています。まず、CHAR(10) フィールドを 1 つだけ持つテーブルを作成し、そこにいくつかの値を挿入します。

テーブル char_test を作成する
(
    char_col CHAR(10)
);
 
char_testに挿入 
価値観
    ('文字列1')。
    (' 文字列2 ')。
    ('文字列3');

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

SELECT CONCAT("'", char_col, "'")
char_testから; 

実行結果

同じ値をVARCHAR(10)フィールドに保存すると、次の結果が得られます。

テーブルvarchar_testを作成する
(
    varchar_col VARCHAR(10)
);
 
varchar_testに挿入 
価値観
    ('文字列1')。
    (' 文字列2 ')。
    ('文字列3');
 
SELECT CONCAT("'", varchar_col, "'")
varchar_test から; 

実行結果

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 の varchar 型と char 型の違いに関するこの記事はこれで終わりです。MySQL の varchar 型と char 型の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 面接官がmysqlのcharとvarcharの違いを尋ねたとき
  • MYSQL における char と varchar の違い
  • MySQL の char、varchar、text フィールド タイプの違い
  • MySQL における VARCHAR と CHAR 形式のデータの違い
  • MySQL データベースにおける char と varchar の違いの分析と使用上の提案
  • MySQL の char と varchar の違いの分析

<<:  CSS でホバー ドロップダウン メニューを実装する方法

>>:  Vue はファジークエリを実装します - MySQL データベースデータ

推薦する

Vue で Alibaba のアイコンフォント ベクター アイコンを使用する方法について

インターネット上には多くのインポート方法があり、公式も3つのインポート方法を提供していますが、インポ...

overflow:hidden の役割の詳細な説明 (オーバーフローの非表示、フロートのクリア、マージンの崩壊の解決)

1. オーバーフロー:非表示 オーバーフロー非表示要素に overflow:hidden が設定さ...

vue+django でファイルをダウンロードする例

目次1. 概要2. Django プロジェクト3. Vueプロジェクト1. 概要プロジェクトで、ダウ...

HTMLはBaidu百科事典のナビゲーションドロップダウンメニュー機能を模倣します

HTML は、Baidu 百科事典のナビゲーション ドロップダウン メニュー機能を模倣します。具体的...

grpc のリバース プロキシとして nginx を使用する場合の落とし穴の概要

背景ご存知のとおり、nginx は高性能な Web サーバーであり、負荷分散やリバース プロキシによ...

Vueはmockjsを使用してシミュレートされたデータケースの詳細を生成します

目次プロジェクトにmockjsをインストールするVueプロジェクトでmockjsを使用する基本的なプ...

MySQL フェイルオーバー ノート: アプリケーション対応設計の詳細な説明

1. はじめに周知のように、データベース ミドルウェアの読み取り/書き込み分離のアプリケーション シ...

koa2 サービスに SSL を設定する方法

I. はじめに1: SSL証明書私のドメイン名は Tencent Cloud にあります。第 3 レ...

MySQL トランザクション分離レベルと MVCC の詳細な説明

目次トランザクション分離レベル同時トランザクション実行中に発生した問題SQL標準の4つの分離レベルM...

CSS が複数のクラスに一致する方法のサンプルコード

CSSは複数のクラスにマッチする次の HTML タグ li、クラスはオープン スタイルです。私の要件...

MySQL フラッシュリストとダーティページフラッシュメカニズム

1. レビューMySQL の起動後にバッファ プールが初期化されます。バッファ プールは N 個の空...

VUE v-for の :key の詳細な説明

v-for タグにキーが追加されていない場合。 <!DOCTYPE html> <...

HTML テーブル境界コントロールの詳細な説明

上の境界線のみを表示する <table frame=above>下の境界線のみを表示する...

Javascript と Vue を組み合わせて、あらゆる迷路画像の自動パス検索を実現します。

目次序文2次元配列、一方向基本インターフェースのマッピング幅優先、包括的検索マップ編集経路探索アルゴ...