sql >> データベース >  >> RDS >> Sqlserver

SQLNVARCHARおよびVARCHARの制限

    NVARCHAR(MAX)に4000の最大セットがあることを理解しています

    あなたの理解は間違っています。 nvarchar(max) 最大(場合によってはそれ以上)の2GBのデータ(10億の2バイト文字)を保存できます。

    Booksonlineのncharとnvarcharからの文法は

    nvarchar [ ( n | max ) ]
    

    | 文字は、これらが代替であることを意味します。つまり、どちらかを指定します n またはリテラルのmax

    特定のnを指定することを選択した場合 この場合、これは1〜4,000である必要がありますが、 maxを使用します ラージオブジェクトデータ型として定義します( ntextの置換 これは非推奨です。

    実際、SQL Server 2008では、変数のようです。 tempdb に十分なスペースがある場合は、2GBの制限を無期限に超えることができます。 (ここに表示)

    あなたの質問の他の部分について

    連結時の切り捨てはデータ型によって異なります。

    1. varchar(n)+ varchar(n) 8,000文字で切り捨てられます。
    2. nvarchar(n)+ nvarchar(n) 4,000文字で切り捨てられます。
    3. varchar(n)+ nvarchar(n) 4,000文字で切り捨てられます。 nvarchar 優先順位が高いため、結果は nvarchar(4,000)になります。
    4. [n] varchar(max) + [n] varchar(max) 切り捨てられません(<2GBの場合)。
    5. varchar(max) + varchar(n) 切り捨てられず(<2GBの場合)、結果は varchar(max)と入力されます。 。
    6. varchar(max) + nvarchar(n) 切り捨てられず(<2GBの場合)、結果は nvarchar(max)と入力されます。 。
    7. nvarchar(max) + varchar(n) 最初にvarchar(n)を変換します nvarchar(n)への入力 次に、連結を行います。 varchar(n)の長さの場合 文字列が4,000文字を超える場合、キャストは nvarchar(4000)になります 切り捨てが発生します

    文字列リテラルのデータ型

    Nを使用する場合 プレフィックスと文字列の長さは<=4,000文字で、 nvarchar(n)と入力されます。 ここで、 n 文字列の長さです。したがって、 N'Foo' nvarchar(3)として扱われます 例えば。文字列が4,000文字より長い場合は、 nvarchar(max)として扱われます。

    Nを使用しない場合 プレフィックスと文字列の長さは<=8,000文字で、 varchar(n)と入力されます。 ここで、 n 文字列の長さです。 varchar(max)より長い場合

    上記の両方で、文字列の長さがゼロの場合、 n 1に設定されています。

    新しい構文要素。

    1。 CONCAT 関数はここでは役に立ちません

    DECLARE @A5000 VARCHAR(5000) = REPLICATE('A',5000);
    
    SELECT DATALENGTH(@A5000 + @A5000), 
           DATALENGTH(CONCAT(@A5000,@A5000));
    

    上記は、両方の連結方法で8000を返します。

    2。 + =に注意してください

    DECLARE @A VARCHAR(MAX) = '';
    
    SET @A+= REPLICATE('A',5000) + REPLICATE('A',5000)
    
    DECLARE @B VARCHAR(MAX) = '';
    
    SET @B = @B + REPLICATE('A',5000) + REPLICATE('A',5000)
    
    
    SELECT DATALENGTH(@A), 
           DATALENGTH(@B);`
    

    返品

    -------------------- --------------------
    8000                 10000
    

    @Aに注意してください 切り捨てが発生しました。

    発生している問題を解決する方法。

    max 以外の2つを連結しているため、切り捨てが発生しています。 データ型を一緒に、または varchar(4001-8000)を連結しているため nvarcharへの文字列 入力された文字列( nvarchar(max)でも 。

    2番目の問題を回避するには、すべての文字列リテラル(または少なくとも4001〜8000の範囲の長さのリテラル)の前に Nが付いていることを確認してください。 。

    最初の問題を回避するには、割り当てをから変更します

    DECLARE @SQL NVARCHAR(MAX);
    SET @SQL = 'Foo' + 'Bar' + ...;
    

    宛先

    DECLARE @SQL NVARCHAR(MAX) = ''; 
    SET @SQL = @SQL + N'Foo' + N'Bar'
    

    NVARCHAR(MAX) は最初から連結に関与します(各連結の結果は NVARCHAR(MAX)にもなります これは伝播します)

    表示時の切り捨ての回避

    「グリッドへの結果」モードが選択されていることを確認してから、使用できます

    select @SQL as [processing-instruction(x)] FOR XML PATH 
    

    SSMSオプションを使用すると、 XMLに無制限の長さを設定できます 結果。 処理命令 ビットは、<などの文字の問題を回避します &lt;として表示されます 。



    1. LINQforJavaツール

    2. 接続に失敗しました:php関数からのユーザー'root' @'localhost'(パスワード:YESを使用)のアクセスが拒否されました

    3. SQLで文字列を連結する方法

    4. SQLで行に番号を付ける方法