web-dev-qa-db-ja.com

SQL Serverのテキスト型とvarcharデータ型

可変長文字データがあり、SQL Server(2005)データベースに格納したい。 TEXT SQL型の選択方法やVARCHAR SQL型の選択方法、パフォーマンス/フットプリント/機能の長所と短所についてのベストプラクティスをいくつか学びたいと思います。

280
George2

SQL Server 2005以降を使用している場合は、varchar(MAX)を使用してください。 textデータ型は推奨されていないため、新しい開発作業には使用しないでください。ドキュメントから:

重要

ntexttext、およびimageのデータタイプは将来削除される予定です。 Microsoft SQL Serverのバージョン。これらのデータ型を新しい開発作業で使用することを避け、現在それらを使用しているアプリケーションを変更することを計画してください。代わりに nvarchar(max)varchar(max) 、および varbinary(max) を使用してください。

200
Mladen Prajdic

TEXTは、大量の文字列データに使用されます。フィールドの長さが特定のしきい値を超えた場合、テキストは行外に格納されます。

VARCHARは常に行に格納され、80文字の制限があります。 VARCHAR(x)を作成しようとすると、x> 80の場合、エラーになります。

サーバー:メッセージ131、レベル15、状態3、行1

型「varchar」に指定されたサイズ()が、任意のデータ型に許可されている最大値(8000)を超えています

これらの長さの制限は、SQL Server 2005内のVARCHAR(MAX)には関係ありません。これは、TEXTのように、行外に格納される可能性があります。

MAXはここでは一種の定数ではないことに注意してください。VARCHARVARCHAR(MAX)は非常に異なる型で、後者はTEXTに非常に近いものです。

以前のバージョンのSQL Serverでは、TEXTに直接アクセスすることはできませんでした。TEXTPTRを取得し、それをREADTEXTおよびWRITETEXT関数でのみ使用できました。

SQL Server 2005では、TEXT列に直接アクセスできます(ただし、それらに値を割り当てるにはVARCHARへの明示的なキャストが必要です)。

TEXTは良いです:

  • データベースに大きなテキストを保存する必要がある場合
  • 列の値を検索しない場合
  • この列を選択することはめったになく、結合しないでください。

VARCHARは良いです:

  • あなたが小さな文字列を格納する場合
  • 文字列値を検索した場合
  • あなたがいつもそれを選択するか、または結合でそれを使うならば。

ここで選択とは、列の値を返すクエリを発行するという意味です。

ここで検索とは、結果がTEXTまたはVARCHAR列の値に依存するクエリをすべて発行することを意味します。これには、任意のJOINまたはWHERE条件での使用も含まれます。

TEXTは行外に格納されているため、TEXT列を含まないクエリは通常高速です。

TEXTが何に適しているかの例をいくつか示します。

  • ブログのコメント
  • Wikiページ
  • コードソース

VARCHARが何に適しているかの例をいくつか示します。

  • ユーザー名
  • ページタイトル
  • ファイル名

経験則として、2文字およびを超えるテキスト値が必要な場合は、この列で結合を使用しないで、TEXTを使用してください。

それ以外の場合はVARCHARを使用してください。

P.S.同じことがUNICODEが有効なNTEXTNVARCHARにも当てはまります。これらは上記の例で使用する必要があります。

P.P.S.SQL Server 2005+TEXTおよびNTEXTの代わりに使用するVARCHAR(MAX)およびNVARCHAR(MAX)にも同じことが当てはまります。それらを常に行外に格納したい場合は、large value types out of rowでそれらのsp_tableoptionを有効にする必要があります。

上記のように ここでTEXTは将来のリリースで推奨されなくなります。

text in rowオプションは、将来のバージョンの{SQL Serverで削除される予定です。新しい開発作業ではこのオプションを使用しないでください。現在text in rowを使用しているアプリケーションを変更することを計画してください。 varchar(max)nvarchar(max)、またはvarbinary(max)データ型を使用して大きなデータを格納することをお勧めします。これらのデータ型の行内および行外の動作を制御するには、large value types out of rowオプションを使用します。

275
Quassnoi

SQL Server 2005では、varchar(max)nvarchar(max)という新しいデータ型が導入されました。これらは古いテキスト型の利点を持っています。2GBのデータを格納できますが、varcharnvarcharの利点もほとんどあります。これらの利点の中にはsubstring()のような文字列操作関数を使う能力があります。

また、サイズが8 KB未満の間、varchar(max)はテーブルの(ディスク/メモリ)スペースに格納されます。フィールドにさらにデータを配置した場合にのみ、そのデータはテーブルのスペース外に格納されます。表のスペースに格納されているデータは(通常は)より早く取り出されます。

手短に言えば、より良い代替手段があるので、決してTextを使わないでください:(n)varchar(max)。そして、通常のvarcharが十分に大きくない場合、すなわち、格納しようとしている文字列が8000文字を超えると予想される場合にのみ、varchar(max)を使用してください。

すでに述べたように、TEXTデータ型にSUBSTRINGを使用できますが、TEXTフィールドの長さが8000文字未満の場合に限られます。

39
edosoft

Ms 2008にはいくつかの大きな変更がありました - >どのデータ型を使うべきかについて決定するとき次の記事を考慮する価値があるかもしれません。 http://msdn.Microsoft.com/ja-jp/library/ms143432.aspx

1バイトあたり

  1. varchar(max)、varbinary(max)、xml、text、またはimage列2 ^ 31-1 2 ^ 31-1
  2. nvarchar(max)列2 ^ 30-1 2 ^ 30-1
7
Draz