最近、クエリでlen()
を使用してクエリの長さを調べるときに問題が発生しました。len()
は、値の末尾のスペースをカウントしていませんでした。ただし、datalength()
は末尾のスペースもカウントします。
これは、値の実際の長さを処理する操作を実行している場合、dalalength()
ではなくlen()
を使用する必要があることを意味しますか?.
例:特定の値の値を10文字にする必要がある場合。つまり、値が3文字の長さの場合、7つのスペースを追加する必要があります。
はい、それはまさにあなたがしなければならないことです。空白を除いた文字数だけを取得したい場合は、LEN()
関数を使用しますが、その他の場合はすべてDATALENGTH()
を使用します。
LEN()
のドキュメントにも、拡張機能を表すバイト数を取得するにはDATALENGTH()
を使用する必要があるという情報があります
MSDNドキュメントへのリンクは次のとおりです。
注意してください。 [〜#〜] datalength [〜#〜] は、文字数ではなく、使用されたバイト数を返します。
lenは必要なストレージではなく使用された文字数をカウントします。これは、varcharの代わりにnvarcharを使用する場合にさらに明確になります。
lenは末尾のスペースもカウントしません
これをみて
declare @v nchar(5)
select @v ='ABC '
select len(@v),datalength(@v)
lenの出力は3で、datalength = 10の出力
Len(Replace( 'blah blah'、 ''、 '_')の提案を使用しようとしていましたが、使用した方が効率的かもしれません。誰かがこのスレッドにつまずいた場合に備えて、投稿してください。
len( '何とか何とか' + '。')-1
Replace()を使用するだけです。
SELECT LEN(REPLACE(N'4 Trailing Spaces: ', ' ', '_'))
これは、末尾のスペースをLEN()が実際にカウントする文字に置き換えます。
DataLength()の問題は、文字列がUnicode(nChar、nVarChar)またはASCII(Char、VarChar))であるかどうかを追跡する必要があることであり、 Unicode文字列のデータ長を2で割ります。
残念ながら私が知っている完璧な解決策はありません。
提案されたソリューションの1つであるLEN(string + '.')-1
は、文字列がサイズ4000または非Unicodeでサイズ8000のUnicodeの場合、誤った結果(-1)を返します。これは、連結が無視されるためです。必要に応じて、文字列をMAXサイズの文字列LEN(CAST(string as nvarchar(max)) + '.')-1
にキャストすることでこれを克服できますが、それだけの価値はありますか?
他の人が述べたように、DATALENGTH(string)
はストレージに使用されるバイト数を返します。 Unicode文字列の場合、結果を2で除算するだけでは不十分な場合があります nicodeサロゲート文字 は16ビットを超える場合があります。
全体として、各アプローチの制限に注意し、問題が少ないと思われるものを選択してください。