1

私は、次のように述べているウェブサイトに出くわしました。

例: CountryCode CHAR(3) CHARSET utf8

正確に 3 文字の列を求めています。この列に必要なストレージは、3 文字の名前が収まる必要があります。これは、(3 文字) x (1 文字あたり 3 バイト) = 9 バイトのストレージを意味します。したがって、CHAR と utf8 を一緒に使用するのは理想的とは言えません。VARCHAR はより適切に動作します。上記のように、1 文字あたりのバイト数だけが必要です。したがって、テキスト「abc」には3バイトしか必要ありません

テキスト 'abc' (utf8 および char(3) を使用) は 3 バイトまたは 9 バイト必要ですか?! ありがとう

4

1 に答える 1

2

MySQL の内部構造は、CHAR フィールドをテーブル構造内に直接配置します。たとえば、次のような単純なテーブルです。

create table foo (
   id int
   name char(3)
);

次のようなディスク上のレコードを生成します

xxxxccccccccc
^^^^-- 4 bytes of int storage space
    ^^^^^^^^^ 9 bytes of utf-8 char space

MySQL は、そのcharフィールドに格納するテキストの種類を事前に知る方法がないため、最悪の場合を想定する必要があり、「可能な限り最も長い」utf-8 テキストの 3 文字分のスペースを割り当てます。かかることがあります。そうしないと、長すぎる文字列がディスク上のストレージをオーバーフローし、隣接するレコードに走り書きを開始します。

一方、varchar は、テーブルの生データに小さな「スタブ」データ セクションしかなく、varchar の内容は別の場所に保存されます。つまり、使用している文字セットの種類に関係なく、varchar(3) は常に同じ量のテーブル スペース ストレージを占有します。

于 2013-06-22T21:47:43.380 に答える