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 は、ゼロから自動デプロイメントを構築します

推薦する

JavaScript デザインパターン 責任連鎖パターン

目次概要コードの実装パラメータ定義成し遂げる責任連鎖パターンの実装改善概要責任チェーン パターンは、...

CSS ですべての子要素を選択し、スタイルを追加する方法

方法:実際のプロジェクトを例に挙げてみましょう。 .lk-ツールバー{ .el-入力{ 幅: 169...

Vue 3 で Vue Router リンクを拡張する方法

序文<router-link> タグは、Vue アプリ内のさまざまなページ間を移動するた...

MySql への新しいユーザーの追加、ユーザー用のデータベースの作成、ユーザーへの権限の割り当ての概要

1. 新しいユーザーを追加するローカルIPアクセスのみを許可する '123456' ...

Ubuntu の MySQL のパラメータ ファイル my.cnf の詳細な分析

序文MySQL に関する私の理解に基づくと、パフォーマンスの最適化作業やマスター スレーブ レプリケ...

シンプルなHTMLとCSSの使い方の詳細な説明

HTML と CSS を含む JD.com のホームページの静的ページ効果を 3 日間で完成させます...

MySQL での and or クエリの優先度分析

これは見落とされがちな問題かもしれません。まず、次の点を明確にする必要があります。 MySQL では...

Ubuntu Server のターミナルのウェルカム メッセージで広告を無効にする方法

最新の Ubuntu Server バージョンを使用している場合、ようこそメッセージに、Ubuntu...

Nginx+Apache の動的および静的分離の導入の詳細な例

Nginx の動的および静的分離の概要Nginx は静的処理能力が強力ですが、動的処理能力が不十分で...

モバイル Web WAP には Bootstrap と jQuery Mobile のどちらを使用すべきか

問題を解決するBootstrap は、次の問題を解決する CSS フレームワークです。デバイス間での...

JS で Websocket ベースのマルチターミナル ブリッジング プラットフォームを実装する方法

目次1. デバッグ対象2. WebSocketの機能3. ソケット接続を確立する3.1 部屋の作成方...

Reactイベントメカニズムソースコード分析

目次原理ソースコード分析委任されたイベントバインディングすべてのサポートされているイベントを聴くネイ...

Dockerモードで起動したTomcatのホームページにアクセスすると404エラーが発生する

シナリオ: docker で tomcat を起動すると (Alibaba Cloud からダウンロ...

優れたユーザー エクスペリエンス デザイナーが行うべき 5 つのこと (画像とテキスト)

この記事は、@C7210 によって翻訳されたブログ「Usability Counts」からの翻訳です...

CentOS 7 で grub パスワードと単一ユーザー ログインを設定するサンプル コード

Centos7 と Centos6 では、GRUB パスワードの設定手順に大きな違いがあります。これ...