2011-10-04 5 views
27

Varcharフィールドの格納要件は入力された文字列の実際の長さに基づいているため、Varcharフィールドをすべて最大値として指定することの欠点は何でしょうか。Varchar(65535)?さて、最大フィールド数> 255文字の場合、余分な1バイトを除いて?すべてのVARCHARをVARCHAR(65535)として指定してみませんか?

[長さLの文字列の記憶Reqts:L + 1バイト列の値は0が必要な場合 - 255バイトを、L + 2バイトの値が255を超えるバイトが必要な可能性がある場合]

ありがとうございました! documentsから

+1

関連性がない場合は関連するhttp://stackoverflow.com/questions/262238/are-there-disadvantages-to-using-a-generic-varchar255-for-all-text-based-fields – JJJ

+0

ありがとうございますあなたのコメント!私はstackoverflowを新しくしており、皆の反応性を心から感謝しています。 :-) – tgoneil

答えて

7

だと思いますvarchar柱の長さは収納程度だけではありません。それらはデータセマンティクスについても同様です。

I.E. name列をvarchar(100)と指定すると、システムに格納されている名前は100文字を超えてはいけません。

物事のストレージ側では、それらは同じである必要があります。列サイズの見積もりは、varchar列の特定の長さを使用するとより正確になります(データ収集を行う統計収集システムがなくてもvarcharサイズ)。

13

- 表カラム・カウントと行サイズ制限:(かかわらず、ストレージエンジンの)

すべてのテーブルは、65,535バイトの最大行サイズを有します。ストレージエンジンは、この制限に追加の制約を課すことがあり、実効最大行サイズを縮小します。

最大行サイズは、すべての列の合計長がこのサイズを超えることができないため、列の数(および場合によってはサイズ)を制限します。たとえば、utf8文字は文字あたり最大3バイトを必要とするため、CHAR(255)CHARACTER SET utf8列の場合、サーバーは値ごとに255×3 = 765バイトを割り当てる必要があります。したがって、テーブルには65,535/765 = 85個以上のカラムを含めることはできません。

可変長列の記憶域には、行サイズに対して評価される長さバイトが含まれます。たとえば、VARCHAR(255)CHARACTER SET utf8列は値の長さを格納するために2バイトを要します。したがって、各値は767バイトまでかかります。したがって

、単一VARCHAR(65535)列を定義、効果的に、あなたは(あなたがそれを埋めていると仮定して)行の単一列に制限されます。

このような大きなサイズは、一部の種類のデータでは完全に間違っていることを除けば、ローカル番号と国際番号を含む電話番号の列がある場合は、VARCHARフィールドを使用することもできますしかし、それを20以上のものに設定することは意味がないかもしれません(私は寛大です)。

は一時テーブルが不必要に長いVARCHARフィールド( - 詳細についてはポストを参照してください再びCHARと背中にこのようなフィールドの変換を行うため)で生成されます場合も可能パフォーマンスの低下を示しビルKarwinからthis answerを参照してください。

+7

@Downvoter - コメントしますか? – Oded

+0

しかし、私のテーブルには実際にVARCHAR(65535)カラム( 'data1'と呼ぶ)以外の追加のカラムがあります。 data1列には実際に最大サイズに近い文字列が含まれていないため、これらの列にはすべてデータが入力されているだけです。 – tgoneil

+2

@tgoneil - 65535文字をその列に挿入し、他の列にデータを挿入してみます。 – Oded

1

考えられる理由としては、他のアプリケーションとの互換性を改善することが考えられます。たとえば、長さ100文字の「product_no」フィールドを使用していて、長さ40文字の「model_no」のような類似のフィールドを使用したアプリケーションとインターフェースしたい場合、それは苦痛になります。40文字を超えるapp_nosは切り捨てられ、アプリケーション間で変換する方法を見つけなければなりません。

0

理由の1つは、フィールドのサイズが入力されたデータのチェックであるということです。誰かが1000文字の電話番号を入力してもらいたいのですか?フィールドが大きすぎると、ごみがデータベースに入力されることを保証する方法になります。

ではなく、実際の電話番号の

「のみフロントオフィスで大きなブロンドに話す」やメモを含む電子メールフィールド午前:あなたはのようなもの(例えば、ランダムに取られていない)と言うの電話番号を持っています彼らはメモフィールドを持っていないので、クライアントについて?電子メールを送信しようとするとうまく動作しません。

ワイドテーブルは、予期しないレコード制限(テーブルを1つのレコードに格納できるよりも広いように設計できます。データが複数のデータページに分かれているため問題が発生します。私はあなたがSQL Serverの広いテーブルからそれを持つことができることを知っています、そして、mysqlが同様の問題に遭遇するなら私は驚くことはありません。しかし、mysqlの専門家は本当にこれに対処する必要があります。インデックス作成は、ワイドフィールドでも問題になる可能性があります。データベースエンジンは、索引が有用であると考える傾向が少なくなる可能性があります。繰り返しますが、mysqlにこの問題があるかどうかはわかりませんが、それは調査するものです。私はこれらがSQL Serverのすべてのフィールドの最大サイズを使用する際の問題であることを知っています.SQL Serverにはこれらの問題やその他の問題がある可能性があります。

0

たとえば、MySQLのMEMORYエンジンはVARCHAR-Fieldsを非常にうまくサポートしていません。エンジンは、実際に使用されている長さではなく、最大バイト数を各行ごとに予約します。そのため、単一のVARCHAR(1000)列を持つ表を定義すると、空の文字列であっても、追加する行ごとに1000 * 3バイトのメモリー使用量が得られます。