ストレージでは、VARCHAR(255)
CHAR(255)
とは異なり、特定の行に必要な長さだけを格納するのに十分スマートです。 これは常に255文字を格納します。
ただし、この質問にMySQLのタグを付けたので、MySQL固有のヒントについて説明します。行がストレージエンジンレイヤーからSQLレイヤーにコピーされるため、VARCHAR
フィールドはCHAR
に変換されます 固定幅の行を操作する利点を得ることができます。そのため、メモリ内の文字列は最大長までパディングされます 宣言されたVARCHAR
の 列。
クエリが暗黙的に一時テーブルを生成する場合。たとえば、並べ替えやGROUP BY
、これは大量のメモリを使用する可能性があります。 VARCHAR(255)
をたくさん使用する場合 それほど長くする必要のないデータのフィールド。これにより、一時テーブルが非常に大きくなる可能性があります。
また、この「パディングアウト」動作は、utf8文字セットで宣言された文字列が1バイトのコンテンツ(たとえば、ASCIIまたはlatin1文字)で格納する文字列の場合でも、1文字あたり3バイトにパディングされることを意味します。同様に、utf8mb4文字セットにより、文字列はメモリ内の文字ごとに4バイトまでパディングされます。
したがって、VARCHAR(255)
utf8では、「意見なし」のような短い文字列を格納すると、ディスク上で11バイト(下位文字セット文字10文字、長さとして1バイト)かかりますが、メモリ内、つまり一時テーブルまたはソートされた結果では765バイトかかります。
私は、無意識のうちに1.5GBの一時テーブルを頻繁に作成し、ディスク領域をいっぱいにしてしまったMySQLユーザーを支援してきました。彼らはたくさんのVARCHAR(255)
を持っていました 実際には非常に短い文字列を格納した列。
保存するデータのタイプに基づいて列を定義することをお勧めします。他の人々が述べているように、アプリケーション関連の制約を適用することには利点があります。ただし、上記で説明したメモリの浪費を回避することには物理的な利点があります。
もちろん、最長の住所が何であるかを知るのは難しいため、多くの人が長いVARCHAR
を選択します。 それは確かにどのアドレスよりも長いです。また、255はVARCHAR
の最大長であるため、通常です。 長さは1バイトでエンコードできます。これは最大のVARCHAR
でもありました 5.0より古いMySQLの長さ。