「varchar(20) 列に 10 ~ 15 文字の 5000 万の値があり、varchar(50) 列に同じ 5000 万の値がある場合、それらはまったく同じスペースを占有します。それが要点です。 char とは対照的に、varchar の。". 誰でも理由を教えてもらえますか?個人の「名前」フィールドの妥当な長さ制限は?を参照してください。
3 に答える
MySQL はストレージ エンジンの選択肢を提供します。データの物理ストレージは、ストレージ エンジンによって異なります。
VARCHAR の MyISAM ストレージ
MyISAM では、VARCHAR
s は通常、文字列の実際の長さに 1 バイトまたは 2 バイトを加えた長さを占めます。これは、行ロック機能ではなく、テーブル ロックに対する MyISAM の設計上の制限によって実用的になります。パフォーマンスへの影響には、よりコンパクトなキャッシュ プロファイルが含まれますが、レコード オフセットのより複雑な (より遅い) 計算も含まれます。
(実際、MyISAM では、テーブル全体で発生する列の種類に応じて、固定の物理行サイズと可変の物理行サイズのテーブル形式をある程度選択できVARCHAR
ます。可変長方式を使用するために同じテーブルも使用します。)TEXT
VARCHAR
物理的な格納方法は、テーブルとは別の話ですが、インデックスでは特に重要です。MyISAM はと列の両方 にスペース圧縮を使用します。つまり、どちらの場合も、データが短いほどインデックス内のスペースが少なくなります。CHAR
VARCHAR
VARCHAR の InnoDB ストレージ
InnoDB は、現在の他のほとんどのリレーショナル データベースと同様に、より洗練されたメカニズムを使用します。 VARCHAR
最大幅が 768 バイト未満の列はインラインで格納され、その最大幅に一致する領域が確保されます。ここでより正確に:
NULL 以外の可変長フィールドごとに、レコード ヘッダーには列の長さが 1 バイトまたは 2 バイトで含まれます。列の一部が外部のオーバーフロー ページに格納されている場合、または最大長が 255 バイトを超え、実際の長さが 127 バイトを超えている場合にのみ、2 バイトが必要になります。外部に保管された列の場合、2 バイトの長さは、内部に保管された部分の長さと、外部に保管された部分への 20 バイトのポインターを加えた長さを示します。内部部分は 768 バイトなので、長さは 768+20 です。20 バイトのポインターには、列の実際の長さが格納されます。
InnoDB は現在、上記の MyISAM とは逆に、そのインデックスでスペース圧縮を行いません。
質問に戻る
ただし、上記はすべて実装上の詳細にすぎず、バージョン間で変更される場合もあります。との真の違いはセマンティックであり、 とのCHAR
違いも同様です。に 30 文字の文字列を格納する方法がないことを保証することで、データベースは、予測どおりに動作するソリューションに統合されると思われるさまざまなプロセッサやアプリケーションの作業をより簡単にし、より適切に定義します。これは大したことです。VARCHAR
VARCHAR(20)
VARCHAR(50)
VARCHAR(20)
特に個人名に関しては、この質問が実践的な指針になるかもしれません。フルネームがUTF-8で70文字以上の人はとにかく困ります。
はい、それは確かにVARCHARの要点です。テキストが長いのと同じくらいのスペースしか必要としません。
CHAR(50)がある場合、データが実際にどれほど短くても(通常はスペースで埋められます)、50バイト(または文字)を使用します。
誰か教えてもらえますか?
無駄なパディングをたくさん保存するのはもったいないと人々が思ったので、彼らはVARCHARを発明しました。
マニュアルには次のように記載されています。
CHAR および VARCHAR 型は、格納する最大文字数を示す長さで宣言されます。(...)
CHAR とは対照的に、VARCHAR 値は、1 バイトまたは 2 バイトの長さのプレフィックスとデータとして格納されます。長さのプレフィックスは、値のバイト数を示します。列は、値が 255 バイト以下しか必要としない場合は長さ 1 バイトを使用し、値が 255 バイトを超える可能性がある場合は長さ 2 バイトを使用します。
VARCHAR(255) はVARCHAR(256) と同じではないことに注意してください。
これは理論です。habeebperwad が示唆するように、1行の実際のフットプリントは(エンジン) ページ サイズと (ハードディスク) ブロック サイズによって異なります。