SQL Server 2005 の Len() と datalength() の比較
-
18-09-2019 - |
質問
最近、使用中に問題が発生しました len()
クエリ内でクエリの長さを調べるには、 len()
値の末尾のスペースがカウントされていませんでした。しかし datalength()
末尾のスペースもカウントします。
これは、値の実際の長さを処理する操作を実行している場合、次を使用する必要があることを意味しますか? dalalength()
以上 len()
.
元:特定の値の値を 10 文字の長さにする必要がある場合。つまり値が 3 文字の長さの場合は、7 つのスペースを追加する必要があります。
他のヒント
気をつけて。 データ長 文字数ではなく、使用されたバイト数を返します。
len は、必要なストレージではなく、使用された文字数をカウントします。これは、varchar の代わりに nvarchar を使用するとさらに明白になります。
len は末尾のスペースもカウントしません
これをみて
declare @v nchar(5)
select @v ='ABC '
select len(@v),datalength(@v)
len の出力は 3 ですが、datalength = 10 の出力は
Replace() を使用するだけです。
SELECT LEN(REPLACE(N'4 Trailing Spaces: ', ' ', '_'))
これにより、末尾のスペースが、LEN() が実際にカウントする文字に置き換えられます。
DataLength() の問題は、Unicode 文字列のデータ長を 2 で割る必要があるかどうかを知るために、文字列が Unicode (nChar、nVarChar) であるか ASCII (Char、VarChar) であるかを追跡する必要があることです。
私はLen(Replace('blah blah ',' ','_')を使おうとしていました それが私に当たったときの提案は、それを使用する方が効率的かもしれません。誰かが私と同じようにこのスレッドに遭遇した場合に備えて投稿するだけです。
len('何とか何とか' + '.')-1
残念ながら、私が知っている限り完璧な解決策はありません。
提案された解決策の 1 つは、 LEN(string + '.')-1
文字列がサイズ 4000 の Unicode であるか、サイズ 8000 の非 Unicode である場合、間違った結果 (-1) を返します。これは、連結が無視されるためです。必要に応じて、文字列を MAX サイズの文字列にキャストすることで、この問題を解決できます。 LEN(CAST(string as nvarchar(max)) + '.')-1
, 、でもそれだけの価値はあるでしょうか?
他の人が述べたように、 DATALENGTH(string)
ストレージに使用されるバイト数を返します。Unicode 文字列の場合、結果を 2 で割るだけでは不十分な場合があります。 Unicode サロゲート文字 16 ビットを超える場合もあります。
全体として、各アプローチの制限に留意し、問題が少なくなると思われる方法を選択してください。