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 データベースデータ

推薦する

異なるインデックスを更新してMySQLのデッドロックルーチンを解決する

前回の記事では、ソース コードを使用してロック関連の情報をデバッグする方法を紹介しました。ここでは、...

Vue v-for ループを書く 7 つの方法

目次1. v-forループでは常にキーを使用する2. 特定のスコープ内でv-forループを使用する3...

ウェブデザインの概要

<br />1998年に最初の個人ページが誕生してから2008年の今日まで、デザイン業界...

React Native の基本原則の深い理解 (Bridge of React Native)

この記事では、React Native の基本をすでに理解していることを前提とし、ネイティブと Ja...

HTMLの表のtbodyは上下左右にスライドできます

テーブル ヘッダーが固定されている場合は、それを 2 つのテーブルに分割する必要があります。1 つの...

Bash の山括弧の深い理解 (初心者向け)

序文Bash には、ls、cd、mv などの重要な組み込みコマンドが多数あるほか、grep、awk、...

MySQL無料インストール版を解凍した後にパスワードが見つからない問題を解決する方法

1. mysql-8.0.21-winx64を解凍する2. 環境変数を設定し、アドレスをbinフォル...

VUE 3 テレポート コンポーネントと使用構文をすぐに使い始める

目次1. テレポートの紹介1.1. 複数のテレポートを使用する2. テレポートを使用する理由3. テ...

JavaScript関数の詳細な説明これを指す問題

目次1.関数内のこの方向1. 通常の機能2. コンストラクター3. オブジェクトメソッド4. イベン...

MySQLはカバーインデックスを使用してテーブルリターンを回避し、クエリを最適化します。

序文カバーリング インデックスについて説明する前に、まずそのデータ構造である B+ ツリーを理解する...

Linux telnetコマンドの使用

1. はじめにtelnet コマンドは、リモート ホストにログインするために使用されます。これは、T...

Vueは要素ツリーコントロールを通じてツリーテーブルを実装します

目次実装効果図依存関係をインストールするカスタムツリーコントロールその他の実装要約するVueでは、要...

HTML 画像 img にハイパーリンクを追加した後の醜い青い境界線の問題を解決する

HTML画像にハイパーリンクを追加すると醜い青い枠線が表示される次のように:解決: CSS スタイル...

JavaScript+html はフロントエンドページでランダム QR コード検証を実装します

クールなフロントエンドページのランダムQRコード検証を参考までに共有します。具体的な内容は次のとおり...

MySQL 5.6 マスタースレーブエラー報告の実践記録

1. 問題の症状バージョン: MySQL 5.6、従来の binlog ファイルと pos 方式を使...