web-dev-qa-db-ja.com

varchar(max)8000列と、8000文字以上を格納できる理由を理解する

From this Microsoft doc、+

nはストリングの長さを定義し、1から8,000の値にすることができます。 maxは、最大ストレージサイズが2 ^ 31-1バイト(2 GB)であることを示します。ストレージサイズは、入力されたデータの実際の長さ+ 2バイトです。

これを理解してください。

Varcharの最大文字数は_8000_であり、_2GB_相当のデータよりもはるかに少ないようです。

特定のテーブルのこのvarchar(max)列に、len(mycolumn)> 100 000のレコードがあることがわかりました。つまり、_8000_文字よりも多くの文字をvarchar(max)列。

質問1:_8000_文字はどのようにして登場し、どこに注意すればよいですか?

質問2:この列への.netデータリーダークエリは、常に100 000文字以上の完全な結果を返しますか?

13
Peter PitLock

なぜこれを誤解しているのかわかります。少しトリッキーです。これらはすべて有効です:

  • VARCHAR(1)-1つの文字列
  • VARCHAR(4000)-4,000文字
  • VARCHAR(8000)-8,000文字-このフィールドの定義に数値を使用する場合、それは使用できる最大のNUMBERですが、次の点に注意してください。
  • VARCHAR(MAX)-最大2GBを保持します。

そして、はい、VARCHAR(MAX)フィールドからデータを取得しようとして、誰かがそこに2GBを格納している場合は、バックルしてください。

30
Brent Ozar

質問1:8000文字はどのようにして登場し、どこに注意すればよいですか?

Nを8000に設定すると、8000文字が使用されます。 char、nchar、nvarchar、およびvarcharに関する Precision、Scale、およびLength(Transact-SQL) の参照に注意する必要があります。対照的に、nをmax(引用符なし)に設定すると、SQL Serverは(引用で述べたように)最大バイト数を格納(および返します)します。

質問2:この列への.netデータリーダークエリは常に100 000以上の文字を含む完全な結果を返しますか?

これは.Net(SQL Serverではない)の質問ですが、.Netデータリーダーはバイトのストリームをフェッチします。バイトは文字ではなく、SQL Serverは(文字ではなく)バイトを返します。 nが8000に設定され、データ型がnvarcharの場合、SQL Serverは最大8000バイトを返します。これは、.Netデータリーダーが4000 Unicode文字であると解釈できます。 nが8000に設定され、データ型がvarcharの場合、SQL Serverは最大8000バイトを返します。これは、.Netデータリーダーが最大8000 ANSI文字であると解釈できます。 nがmaxに設定され、データ型がnvarcharである場合、SQL Serverは最大2 ^ 31-1バイトを返します。これは、.Netデータリーダーが最大(2 ^ 31-1)/ 2文字であると解釈できます。 nがmaxに設定され、データ型がvarcharの場合、SQL Serverは最大2 ^ 31-1バイトを返します。これは、.Netデータリーダーが最大2 ^ 31-1 ANSI文字であると解釈できます。

「nchar」または「nvarchar」ではなく「char」または「varchar」を使用することを選択した場合、より多くの「文字」(より正確にはバイト)を格納できるため、多くのUnicode文字には同等のANSI文字がないことに注意する必要があります(したがって、世界のユーザーは、アプリでローカライズされた/ネイティブの文字を見ることができません)。

7
Bill