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の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Vue3はフロントエンドのログを出力するためにaxiosインターセプターを使用する
>>: Docker+gitlab+jenkins は、ゼロから自動デプロイメントを構築します
1. /etc/init.d ディレクトリに入ります: cd /etc/init.d 2. tomc...
目次1. はじめに2. 行き詰まった問題の分析3. 解決策(理論) 4. ソリューション(コード) ...
フレームセットと本文は同じレベルにあるため、本文にフレームセットを配置することはできません。まずペー...
Web ページを作成するときに、テーブルの幅が揃っていないという問題に遭遇することがよくあります。 ...
GitHub にはあらゆる種類の魔法のツールがあります。今日、私はデータベースを操作するためのコマン...
1 公式サイトからMySQL8をダウンロードしてインストールするMySQL8 ダウンロードアドレスこ...
HTTPとは何ですか?ウェブサイトを閲覧したいときは、ブラウザのアドレス バーにウェブサイトのアド...
今日は、Windows 10 で Linux サブシステムを有効にする方法を紹介します。早速、手順を...
1. タイプの導入1.1 ドメインベースの仮想ホスティングいわゆるドメイン名ベースの仮想ホストとは、...
目次1.mysqlダンプ実行プロセス:特徴2. CSVファイルをエクスポートする(最も柔軟性が高い)...
<br />言葉は、人間の思考や感情を伝えるために必然的に生み出されるものです。人類の文...
アナコンダのインストールAnaconda は、Python の使用を容易にするために作成されたソフト...
負荷分散とは何ですか?ドメイン名が複数の Web サーバーを指している場合は、nginx ロード バ...
nginx の HTTP モジュールを作成する場合、リクエスト開始時のアクセス許可の有無、コンテンツ...
最近、実践的なトレーニング プロジェクトを実行する際に ssm フレームワークを使用しました。プロジ...