多くの場所で、char および varchar データ型選択の原則を分析するときに、ストレージ エンジンが無視されることがよくあります。実際には、選択したストレージ エンジンに基づいて、適切なデータ型を選択する方法を決定する必要があります。
value | char(3) | 実際に格納された文字の長さ | varchar(3) | 実際に格納された文字の長さ |
---|---|---|---|---|
" | ' ' | 3 | 「 | 1 |
'ab' | 'ab' | 3 | 'ab' | 3 |
'abc' | 'abc' | 3 | 「ABC」 | 4 |
'abcdefg' | 'abc' | 3 | 'abc' | 4 |
概要: 上の表からわかるように、char は固定長です。
Char は固定長型、varchar は非固定長型、varchar は可変長型です。なぜ varchar の長さがデータの長さよりも大きいのかと疑問に思う人もいるかもしれません。 VARCHAR は 1 バイトまたは 2 バイトの長さのプレフィックス + データで保存されるためです。 VARCHAR 列の宣言された長さが 255 より大きい場合、長さプレフィックスは 2 バイト、それ以外の場合は 1 バイトです。
MyISAM データ テーブルでは、可変長データ列の代わりに固定長データ列を使用するのが最善です。
は、VARCHAR 型の使用を推奨します。
InnoDB データ テーブルの場合、内部行ストレージ形式は固定長列と可変長列を区別しません (すべてのデータ行はデータ列値へのヘッド ポインターを使用します)。そのため、本質的には、固定長 CHAR 列を使用することが必ずしも良いとは限りません。可変長 VARCHAR 列を使用するよりも簡単です。したがって、主なパフォーマンス要因は、データ行によって使用されるストレージの総量です。 CHAR は VARCHAR よりも平均して多くのスペースを占有するため、処理する必要があるデータ行の合計ストレージとディスク I/O を最小限に抑えるには、VARCHAR を使用することをお勧めします。
MEMORY データ テーブルは現在、固定長データ行ストレージを使用しているため、CHAR 列と VARCHAR 列のどちらを使用するかは関係ありません。どちらもCHAR型として扱われます。
1. utf-8 の中国語は 3 バイトを占有し、gbk は 2 バイトを占有することは誰もが知っています。では、varchar(20) は 20 バイト、つまり 6 つの漢字しか格納できないのですか?
回答: これは事実ではありません (5.0 より前のバージョンはこのようであるとオンラインで言われていますが、テストはありません)。 mysql varchar(20) は中国語と英語の両方で 20 を格納できますが、varchar フィールドの最大長はエンコーディングに関係しており、utf-8 の場合は約 65535/3、gbk の場合は約 65535/3 になります。は約 65535/2 です
多くの場所 char および varchar データ型の選択原則を分析するとき、ストレージ エンジンは無視されることがよくあります。実際には、選択したストレージ エンジンに基づいて、適切なデータ型を選択する方法を決定する必要があります。
上記は、MySQL における char および varchar データ型の選択原則の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。