MySQL CHARとVARCHARの選択方法

MySQL CHARとVARCHARの選択方法

VARCHAR 型と CHAR 型

VARCHAR と CHAR は、文字を格納するために使用される 2 つの主要な文字列型です。残念ながら、実装はストレージ エンジンに依存するため、これらの文字列がディスク上およびメモリ内にどのように格納されるかを説明するのは困難です。一般的に使用される InnoDB と MyISAM に加えて、他のストレージ エンジンを使用する場合は、ストレージ エンジンのドキュメントを注意深く読む必要があります。​

VARCHAR は可変長文字列を格納し、最も一般的に使用される文字データ型です。 VARCHAR は固定長型よりも必要なストレージ スペースが少なく、使用するストレージ スペース (たとえば、短い文字列が占めるスペース) も最小限に抑えられます。 MyISAM の場合、テーブルの作成時に ROW_FORMAT=FIXED が指定されると、フィールドの保存に固定スペースが使用され、スペースが無駄になります。 VARCHAR は、文字列の長さを格納するために 1 ~ 2 バイトを追加します。最大長が 255 バイト未満の場合は 1 バイト、それ以上の場合は 2 バイトです。したがって、ラテン文字セット VARCHAR(10) は 11 バイトのストレージを使用し、VARCHAR(1000) は 1002 バイトのストレージを使用します。​

VARCHAR はスペースを節約するため、パフォーマンスが向上します。ただし、可変長であるため、データ テーブルが更新されるとデータ行のストレージ領域が変わり、ある程度のオーバーヘッドが追加されます。データ行の長さが原因で元の保存場所に収まらない場合は、異なるストレージ エンジンによって異なる方法で処理されます。たとえば、MyISAM では断片化されたデータ行が生成される場合がありますが、InnoDB では更新されたデータ行を保存するためにディスク ページングが必要です。​

一般に、列の最大長が平均長よりもはるかに長い場合 (オプションのメモ フィールドなど) や、更新頻度が低く断片化が問題にならない場合は、VARCHAR を使用するとコスト効率が高くなります。 UTF-8 文字セットを使用する場合、実際に保存されるバイト長は文字によって決まることに注意してください。中国語の場合、推奨される保存文字セットは utf8mb4 です。​

CHAR 型の長さは固定されており、MySQL は各フィールドに十分なストレージ スペースを割り当てます。 CHAR 型の値を保存する場合、MySQL は後続の余分な null 文字を削除します。比較のために、値は null 文字を使用して整列されます。短い文字列の場合は CHAR の方が有利であり、すべての値がほぼ同じ長さの場合は CHAR を使用できます。たとえば、MD5 の長さは常に固定されているため、ユーザー パスワードの MD5 値を保存する場合は CHAR を使用する方が適切です。同時に、フィールド値が頻繁に変更されるデータ型の場合、CHAR は断片化を生成しないため、VARCHAR よりも CHAR の方が有利です。非常に短いデータ列の場合、CHAR を使用する方が VARCHAR を使用するよりも効率的です。たとえば、CHAR(1) を使用して論理値 Y と N を格納する場合、必要なバイト数は 1 バイトだけですが、VARCHAR の場合は 2 バイトが必要です。 ヌル文字を削除するのは奇妙に感じるかもしれません。例を見てみましょう。

テーブル t_char_varchar_test を作成します (
  id INT 主キー、
  char_col CHAR(10)、
  varchar_col VARCHAR(10)
);

t_char_varchar_testに挿入 
価値観 
(1, '文字列1', '文字列1'),
(2, '文字列2', '文字列2'),
(3, '文字列3', '文字列3');

上記の結果をデータ テーブルに挿入すると、string2 の先頭のスペースは削除されませんが、CHAR 型のストレージを使用すると、string3 の末尾のスペースは削除されます。SQL クエリの結果を使用して、次のことを確認します。

SELECT CONCAT("'", char_col, "'"), CONCAT("'", varchar_col, "'") 
t_char_varchar_testから1

結果は以下のようになります。CHAR 型では string3 の後のスペースが削除されていますが、VARCHAR 型では削除されていないことがわかります。この状況では、ほとんどの場合、問題は発生しません。実際には、両端の空文字を削除するために、アプリケーションでトリム関数がよく使用されます。ただし、スペースを格納する必要がある場合は、CHAR 型を使用しないように注意する必要があります。

データの保存方法はストレージ エンジンによって決定され、ストレージ エンジンは固定長データと可変長データを異なる方法で処理します。メモリ エンジンは固定サイズの行を使用するため、データ長が可変であっても、可能な限り最大のストレージ領域を割り当てる必要があります。ただし、文字列の配置と null の切り捨ては MySQL サーバーによって実行されるため、すべてのストレージ エンジンで同じになります。​

CHAR や VARCHAR に似ているのが BINARY と VARBINARY で、これらはバイナリ バイト文字を格納するために使用されます。BINARY は文字 0 のバイト値を使用して配置され、取得時に値が切り捨てられることはありません。文字の代わりに文字のバイト値を使用する必要がある場合は、比較時に大文字と小文字を区別する必要がなく、また MySQL では一度に 1 バイトしか比較されないため、BINARY を使用する方が効率的です。​

結論:

実際のデータ テーブル設計では、ほとんどの場合 VARCHAR が選択されますが、VARCHAR では文字列の長さを格納するために 1 ~ 2 バイト余分に必要になります。データ テーブルで可能な限り短い VARCHAR を使用して効率を向上できるように、アプリケーションでフィールドの最大長を制限することが最善であることに注意してください。同時に、固定長、非常に短い長さ、または長さの変化が非常に小さい文字型の場合は、ストレージ効率を向上させるために CHAR クラス ストレージを使用することをお勧めします。

上記はMySQL CHARとVARCHARの選択の詳細です。MySQL CHARとVARCHARの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Mysql の varchar 型に関する注意点
  • MySQL CHARとVARCHARの保存と読み取りの違い
  • MYSQL における char と varchar の違い
  • MySQL の char、varchar、text フィールド タイプの違い
  • Mysql varchar型の合計操作例
  • MySQL の int、char、varchar のパフォーマンスを比較する
  • MySQL で varchar の長さを動的に変更する方法
  • Mysqlでvarcharの長さを設定する方法
  • Mysql データベースで varchar 型を int 型に変換する方法
  • MySQLはvarchar型とnvarchar型の特殊文字をどのように処理しますか
  • 面接官がmysqlのcharとvarcharの違いを尋ねたとき

<<:  Vue3はフロントエンドのログを出力するためにaxiosインターセプターを使用する

>>:  Docker+gitlab+jenkins は、ゼロから自動デプロイメントを構築します

推薦する

Linux システムで Tomcat を自動的に起動するための設定方法の紹介

1. /etc/init.d ディレクトリに入ります: cd /etc/init.d 2. tomc...

CocosCreator ScrollView 最適化シリーズ: フレーム読み込み

目次1. はじめに2. 行き詰まった問題の分析3. 解決策(理論) 4. ソリューション(コード) ...

iframe を介してフレームセットを本体に配置する

フレームセットと本文は同じレベルにあるため、本文にフレームセットを配置することはできません。まずペー...

HTML テーブル セルの幅と高さを設定する方法

Web ページを作成するときに、テーブルの幅が揃っていないという問題に遭遇することがよくあります。 ...

MySQLデータベースを操作するためのコマンドラインツールmycliの簡単な紹介

GitHub にはあらゆる種類の魔法のツールがあります。今日、私はデータベースを操作するためのコマン...

Win10にMySQL8圧縮パッケージ版をインストールするチュートリアル

1 公式サイトからMySQL8をダウンロードしてインストールするMySQL8 ダウンロードアドレスこ...

基礎知識: ウェブサイトのアドレスの前の http はどういう意味ですか?

HTTPとは何ですか?ウェブサイトを閲覧したいときは、ブラウザのアドレス バーにウェブサイトのアド...

Win10 の Linux サブシステムを有効にする方法を説明します (詳細な画像とテキスト付き)

今日は、Windows 10 で Linux サブシステムを有効にする方法を紹介します。早速、手順を...

複数のドメイン名、ポート、IP仮想ホストに基づくNginx構成

1. タイプの導入1.1 ドメインベースの仮想ホスティングいわゆるドメイン名ベースの仮想ホストとは、...

MySQLテーブルをコピーする方法

目次1.mysqlダンプ実行プロセス:特徴2. CSVファイルをエクスポートする(最も柔軟性が高い)...

デザイン理論:フォントデザインの基礎

<br />言葉は、人間の思考や感情を伝えるために必然的に生み出されるものです。人類の文...

Windows での PyTorch 開発環境のインストール チュートリアル

アナコンダのインストールAnaconda は、Python の使用を容易にするために作成されたソフト...

Nginx ロードバランシング/SSL 構成の実装

負荷分散とは何ですか?ドメイン名が複数の Web サーバーを指している場合は、nginx ロード バ...

nginx の http リクエスト処理の各段階の詳細な分析

nginx の HTTP モジュールを作成する場合、リクエスト開始時のアクセス許可の有無、コンテンツ...

Tomcatにデプロイされたアプリケーションがフロントエンドページにアクセスできない問題について

最近、実践的なトレーニング プロジェクトを実行する際に ssm フレームワークを使用しました。プロジ...