短いテキスト文字列を SQL Server データベースに保存するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/54512

質問

varchar(255)、varchar(256)、nvarchar(255)、nvarchar(256)、nvarchar(max)など?

256 という数字は、丸くてスペース効率の良い素敵な数字のように思えます。しかし、255 がよく使われているのを見てきました。なぜ?

varchar と nvarchar の違いは何ですか?

役に立ちましたか?

解決

VARCHAR(255)。255 文字すべてのストレージを使用するわけではなく、必要なストレージのみを使用します。256 ではなく 255 です。これは、255 にヌル ターミネータ (またはサイズ バイト) を加えたスペースがあるためです。

「N」は Unicode を表します。非 ASCII 文字が予想される場合に使用します。

他のヒント

MS SQL Server (7.0 以降) では、varchar データは内部的に最大 3 つの値で表されます。

  • 実際の文字列。0 から 8000 バイト以上になります (ページ サイズ、行に格納されている他の列、およびその他のいくつかの要素に基づきます)。
  • データ文字列の長さを示すために使用される 2 バイト (0 ~ 8000+ の値が生成されます)
  • 列が NULL 可能である場合、行の NULL ビットマスク内の 1 ビット (したがって、最大 8 つの NULL 可能列の NULL ステータスを 1 バイトで表すことができます)

重要な部分は、2 バイトのデータ長インジケーターです。1 バイトの場合、長さ 0 ~ 255 の文字列のみを適切に記録できます。2 バイトを使用すると、長さ 0 から 64000 以上 (具体的には 2^16 -1) までの文字列を記録できます。ただし、SQL Server のページ長は 8k であり、これが 8000 文字以上の制限の由来です。(SQL 2005 にはデータ オーバーフローの問題がありますが、文字列がそれほど長くなる場合は、varchar(max) を使用する必要があります。)

したがって、varchar データ型列を (15, 127, 511) と宣言したとしても、実際に各行に格納されるものは次のとおりです。

  • 文字列の長さを示す 2 バイト
  • 実際の文字列、つまりその文字列内の文字数

ここで私の要点を説明します。多くの古いシステムでは、文字列長の保存に 1 バイトのみが使用され、最大長は 255 文字に制限されていましたが、これはそれほど長くはありません。2 バイトであれば、そのような任意の制限はありません...したがって、(技術志向ではないと思われる) ユーザーにとって意味のある番号を選択することをお勧めします。, 50、100、250、500、さらには1000も好きです。ベースが 8000 バイト以上のストレージであることを考えると、255 または 256 は 200 または 250 と同じくらい効率的です。 少ない エンドユーザーに説明するときに効率的です。

これはシングルバイトデータに適用されます(つまり、ansii、SQL_Latin1*_*General_CP1 などal.)。異なるアルファベットを使用して複数のコード ページまたは言語のデータを保存する必要がある場合は、nvarchar データ型を使用する必要があります (これは同じように動作すると思います。文字数には 2 バイトですが、データの実際の文字ごとに 2 バイトが必要です)。ストレージのバイト数)。8000 を超える可能性のある文字列、または nvarchar で 4000 を超える可能性のある文字列がある場合は、[n]varchar(max) データ型を使用する必要があります。

データの長さを追跡するためだけに余分なバイトでスペースを占有することが非常に重要である理由を知りたい場合は、以下を確認してください。 http://www.joelonsoftware.com/articles/fog0000000319.html

フィリップ

char/varchar と N のバリエーションを定義するときに考慮すべき点が他にもいくつかあります。

まず、可変長文字列をデータベースに保存するには、ある程度のオーバーヘッドが発生します。一般的な経験則として、長さが 10 文字未満の文字列には CHAR を使用することをお勧めします。これは、N/VARCHAR は文字列と長さの両方を格納し、格納する文字列との違いも格納するためです。 短い N/CHAR の文字列と10 未満の N/VARCHAR は、文字列長のオーバーヘッドの価値がありません。

次に、SQL サーバーのテーブルは 8 KB ページに格納されるため、データ行の最大サイズは 8060 バイトです (残りの 192 バイトは SQL によるオーバーヘッドに使用されます)。SQL では、VARCHAR(8000) および NVARCHAR(4000) の最大定義列が許可されるのはこのためです。今あなた できる VARCHAR(MAX) と Unicode バージョンを使用してください。ただし、これに関連して余分なオーバーヘッドが発生する可能性があります。

私の記憶が間違っていなければ、SQL サーバーは行の残りの部分と同じページにデータを保存しようとしますが、VARCHAR(Max) 列にあまりにも多くのデータを入れようとすると、それをバイナリとして扱い、別のページに保存します。

CHAR と VARCHAR のもう 1 つの大きな違いは、ページ分割に関係しています。SQL Server がデータを 8 KB ページに格納することを考えると、1 ページに任意の数のデータ行を格納できます。もし、あんたが アップデート 行がページに収まらないほど大きい値を持つ VARCHAR 列の場合、サーバーは スプリット そのページは、いくつかのレコードから移動します。データベースに使用可能なページがなく、データベースが自動拡張するように設定されている場合、サーバーはまずデータベースを拡張して空白ページを割り当て、次に空白ページをテーブルに割り当て、最後に 1 ページを 2 つに分割します。

英語以外の言語をサポートする場合は、nvarchar を使用することをお勧めします。

HTML は、標準の ASCII 文字が含まれている限り問題ありません。私は主に多言語をサポートするデータベースで nvarchar を使用してきました。

あるから 1バイトに8ビット したがって、1 バイトに最大 256 個の個別の値を保存できます。

0 1 2 3 4 5 ... 255

最初の数値は 0 なので、合計は 0 であることに注意してください。 256 数字。

したがって、nvarchar(255) を使用すると、次のようになります。 長さを格納するための 1 バイト ただし、1 つずれて nvarchar(256) を使用すると、さらに 1 バイトを無駄にすることになります。 ただ その追加のアイテムについては、255 から 1 アイテムがオフになります (必要なため、 数値 256 を格納する 2 バイト).

これは SQL サーバーの実際の実装ではないかもしれませんが、これが 256 個の項目を 255 個に制限する一般的な理由だと思います。

そして ンバーチャー Unicode 用であり、1 文字あたり 2 バイト以上を使用します。
可変長文字 1バイトのみを使用する通常のASCIIテキスト用です

IIRC、255 は、テキスト データ型に切り替える必要がなくなる前の、またはある時点での MySQL の varchar の最大サイズです (実際には、現在はもっと大きくなっていると思います)。したがって、255 に維持すると、互換性が得られる可能性があります。ただし、行動する前にこれを調べてください。

varchar と nvarchar は、ASCII と Unicode のようなものです。varchar は 1 文字あたり 1 バイトに制限されていますが、nvarchar は 2 バイトを使用できます。varchar(8000) は使用できるが、nvarchar(4000) のみ使用できるのはそのためです。

varchar と nvarchar は両方ともコンテンツに合わせて自動サイズ調整されますが、列の型を宣言するときに定義する数値は最大値です。

Unicode は 2 バイトであるため、「nvarchar」の値は「varchar」の 2 倍のディスク/メモリ領域を占有しますが、列の型を宣言するときは、バイト数ではなく文字数を宣言することになります。

したがって、列の型を定義するときは、その列が保持する必要がある最大文字数を決定し、それを varchar (または nvarchar) サイズとして設定する必要があります。

経験則として、列が保持する必要がある文字列の最大長を見積もり、そこに約 10% 多くの文字のサポートを追加して、将来予想外に長いデータによる問題が発生するのを回避します。

varchar(255) は、SQL Server 7.0 以前の最大長でもありました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top