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

推薦する

LinuxとGNUシステムの関係の詳細な説明

目次私たちが毎日実行している Linux システムとは何でしょうか? LinuxカーネルとGNUシス...

Dockerコンテナ接続実装手順の分析

一般的に言えば、コンテナが起動した後、ポート マッピングを通じてコン​​テナが提供するサービスを使用...

mysql8 共通テーブル式 CTE 使用例の分析

この記事では、例を使用して、MySQL 8 の共通テーブル式 (CTE) の使用方法を説明します。ご...

Vueプロジェクトの支払い機能コードの詳細な説明

1. Alipay方式: Alipay メソッド: Alipay をクリックして支払い、バックエンド...

UDP シンプル サーバー クライアント コード例

UDP の理論については詳しく説明しません。UDP に関する HelloWorld プログラムを紹介...

Reactの状態管理の3つのルールのまとめ

目次序文No.1 焦点No.2 複雑な状態ロジックの抽出No.3 複数状態操作の抽出要約する序文Re...

DockerでRabbitMqの共通クラスタとミラークラスタを構築する詳細な操作

目次1. RabbitMqの動作環境を構築する1.検索を通じてrabbitmqイメージを照会する2....

Vue.js と MJML でレスポンシブなメールを作成する

MJML は、開発者が美しく、応答性に優れ、あらゆるデバイスやメール クライアントで動作する魅力的な...

Vue が Web オンラインチャット機能を実現

この記事では、Webオンラインチャットを実装するためのVueの具体的なコードを参考までに紹介します。...

Vue.jsはElement-uiを使用してナビゲーションメニューを実装します

この記事では、Element-uiを使用してvue.jsでナビゲーションメニューを実装するための具体...

MySQL 8.0.24 のインストールと設定方法のグラフィックチュートリアル

この記事では、MySQL 8.0.24のインストールチュートリアルを参考までに紹介します。具体的な内...

HTTP サーバーとクライアントのやり取りをシミュレートする Node.js+postman

目次1. NodeがHTTPサーバーを構築する2. HTTPサーバーがリクエストを取得する1. Po...

ウェブページで Enter キーを押すと自動的にフォームを送信し、他のページにジャンプするソリューション

ウェブページでEnterキーを押すと、フォームは自動的に送信され、他のページに移動します。クエリフォ...

Web 上の要素を非表示にする方法とその利点と欠点

ソースコードの例: https://codepen.io/shadeed/pen/03caf6b36...

MySQLのユーザー権限の確認と管理方法の詳細な説明

この記事では、例を使用して、MySQL ユーザー権限を確認および管理する方法を説明します。ご参考まで...