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