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文字以上の完全な結果を返しますか?
なぜこれを誤解しているのかわかります。少しトリッキーです。これらはすべて有効です:
そして、はい、VARCHAR(MAX)フィールドからデータを取得しようとして、誰かがそこに2GBを格納している場合は、バックルしてください。
質問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文字がないことに注意する必要があります(したがって、世界のユーザーは、アプリでローカライズされた/ネイティブの文字を見ることができません)。