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


13

この Microsoftドキュメントから、+

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

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

varcharの最大文字数8000はのよう2GBです。これは、データの価値よりもはるかに少ないです。

varchar(max)特定のテーブルのこの列には、len(mycolumn)100,000を超えるレコードがあることがわかります。したがって8000varchar(max)列よりも文字数が多いことがわかります。

質問1:8000キャラクターはどのように登場し、どこで注意すべきですか?

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


varchar(max)は一度呼び出さtextれ、異なるデータ型として扱われたことに注意してください。
ミスターリスター

たぶんこれを読んで?その関連 8Kのページサイズに。1ページに収まるには大きすぎる値(実際には8000よりわずかに大きい)は、LOB_DATAページ(大規模オブジェクト)に保存されます。
ジャスティン

回答:


30

なぜこれを誤解しているのかわかります-少し注意が必要です。これらはすべて有効です。

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

そして、はい、もしVARCHAR(MAX)フィールドからデータを取得しようとして、誰かがそこに2GBを保存していたら、失敗します。


3
and somebody stored 2GB in there, buckle up.-いくつかのblobファイルでそこにいた
Ruslan

7

質問1:8000キャラクターはどのように登場し、どこで注意すべきですか?

nを8000に設定すると、8000文字が有効になります。char、nchar、nvarchar、およびvarcharについての精度、スケール、および長さ(Transact-SQL)の参照に注意する必要があります。対照的に、nをmax(引用符なし)に設定すると、SQL Serverは最大バイト数を格納(および返し)します(引用文で述べたように)。

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

これは.Net(SQL Serverではない)の質問ですが、.Netデータリーダーはバイトストリームをフェッチします。バイトは文字ではなく、SQL Serverは(文字ではなく)バイトを返します。nが8000に設定され、データ型がnvarcharの場合、SQL Serverは最大8000バイトを返します。これは、.Netデータリーダーが4000ユニコード文字として解釈できます。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文字であると解釈できます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.