web-dev-qa-db-ja.com

MySQL:なぜVARCHAR(255)ではなくVARCHAR(20)を使用するのですか?

可能性のある複製:
すべてのテキストベースのフィールドに汎用varchar(255)を使用することには欠点がありますか?

MYSQLでは、VARCHARフィールドタイプの長さを選択できます。可能な値は1〜255です。

しかし、VARCHAR(20)の代わりに最大値であるVARCHAR(255)を使用する場合の利点は何ですか?私の知る限り、エントリのサイズは挿入された文字列の実際の長さにのみ依存します。

サイズ(バイト)=長さ+ 1

したがって、VARCHAR(255)フィールドに「Example」という単語がある場合、8バイトになります。 VARCHAR(20)フィールドにある場合、8バイトもあります。違いはなんですか?

助けていただければ幸いです。前もって感謝します!

30
caw

チェックアウト: Varcharのリファレンス

要するに、VARCHARの255のサイズを超えない限り、長さのプレフィックスに別のバイトが必要になるため、大きな違いはありません。

長さは、列に格納されているデータに対する他の制約よりも多くの制約を示しています。これにより、列の最大ストレージサイズも本質的に制約されます。私見、長さはデータに関して意味があるはずです。社会保障番号を保存する場合、実際に保存するのがSSNである場合、ストレージに費用はかかりませんが、長さを128に設定しても意味がありません。

28
RC.

最大値よりも小さい値を選択するのには、パフォーマンスに関係しない多くの正当な理由があります。サイズを設定すると、保存しているデータのタイプを示すのに役立ち、最後の瞬間の検証形式としても機能します。

たとえば、英国の郵便番号を保存する場合、必要なのは8文字のみです。この制限を設定すると、保存するデータのタイプを明確にするのに役立ちます。 255文字を選択した場合、問題が混乱するだけです。

17
Dan Diplo

MySQLについては知りませんが、SQL Serverでは、使用される合計バイト数が実際にレコードに格納できる合計バイト数よりも大きくなるようにフィールドを定義できます。これは悪いことです。遅かれ早かれ、限界に達する行が表示され、データを挿入できなくなります。

行サイズの制限を考慮するために、データベース構造を設計することをお勧めします。

さらに、最大値を10にする必要があるフィールドに200文字を入力したくない場合もあります。そうする場合、ほとんどの場合、それは不良データです。

おっしゃるとおり、アプリケーションレベルで制限できます。ただし、データは1つのアプリケーションからだけデータベースに取り込まれるわけではありません。複数のアプリケーションで使用される場合や、データがインポートされる場合や、クエリウィンドウから手動で修正される場合があります(すべてのレコードを更新して、たとえば価格に10%を追加する)。これらの他のデータソースのいずれかが、アプリケーションに設定したルールを知らない場合、データベース内に不正な、役に立たないデータがあります。データの整合性は、データベースレベルで強制する必要があります(データを入力する前に確認することを妨げない)か、整合性がありません。加えて、データベースを設計するのが面倒な人は、実際にはアプリケーションに実際に制限を加えるのが面倒であり、データの整合性チェックがまったく行われないというのが私の経験です。

データ整合性のないデータベース用のWordがあります-役に立たない。

5
HLGEM

意味的な違いがあります(それが唯一の違いだと思います)。30個の非スペース文字をvarchar(20)に入力しようとすると、エラーが発生しますが、varchar(255)では成功します。したがって、これは主に追加の制約です。

2

まあ、もしあなたがより大きなエントリを許可したいなら、あるいはおそらくエントリサイズを制限したいなら。

たとえば、first_nameにはVARCHAR 20を使用できますが、20では十分でない可能性があるため、street_addressにはVARCHAR 50を使用できます。同時に、その値を取得できる大きさを制御することもできます。

つまり、理論的には、テーブル(および潜在的にインデックス/インデックスエントリ)が大きくなりすぎるのを防ぐために、特定の値の大きさの上限を設定しました。

固定幅のCHARを使用することもできますが、より小さくできるVARCHARとは異なり、CHARは値を埋め込みます(ただし、これによりSQLアクセスが高速になります)。

1
OneNerd

データベースの観点から見ると、パフォーマンスの面で違いがあるとは思いません。

ただし、使用する長さに関する多くの決定は、達成しようとしていることと、必要なデータだけを受け入れるようにシステムを文書化することにかかっていると思います。

1
Mitchel Sellers