web-dev-qa-db-ja.com

SQL Server 2005のLen()とdatalength()

最近、クエリでlen()を使用してクエリの長​​さを調べるときに問題が発生しました。len()は、値の末尾のスペースをカウントしていませんでした。ただし、datalength()は末尾のスペースもカウントします。

これは、値の実際の長さを処理する操作を実行している場合、dalalength()ではなくlen()を使用する必要があることを意味しますか?.

例:特定の値の値を10文字にする必要がある場合。つまり、値が3文字の長さの場合、7つのスペースを追加する必要があります。

30
Arun P Johny

はい、それはまさにあなたがしなければならないことです。空白を除いた文字数だけを取得したい場合は、LEN()関数を使用しますが、その他の場合はすべてDATALENGTH()を使用します。

LEN()のドキュメントにも、拡張機能を表すバイト数を取得するにはDATALENGTH()を使用する必要があるという情報があります

MSDNドキュメントへのリンクは次のとおりです。

LEN()

DATALENGTH()

20
RaYell

注意してください。 [〜#〜] datalength [〜#〜] は、文字数ではなく、使用されたバイト数を返します。

36
Joe Chung

lenは必要なストレージではなく使用された文字数をカウントします。これは、varcharの代わりにnvarcharを使用する場合にさらに明確になります。

lenは末尾のスペースもカウントしません

これをみて

declare @v nchar(5)
select @v ='ABC  '


select len(@v),datalength(@v)

lenの出力は3で、datalength = 10の出力

11
SQLMenace

Len(Replace( 'blah blah'、 ''、 '_')の提案を使用しようとしていましたが、使用した方が効率的かもしれません。誰かがこのスレッドにつまずいた場合に備えて、投稿してください。

len( '何とか何とか' + '。')-1

2
Jay Wheeler

Replace()を使用するだけです。

SELECT LEN(REPLACE(N'4 Trailing Spaces:    ', ' ', '_'))

これは、末尾のスペースをLEN()が実際にカウントする文字に置き換えます。

DataLength()の問題は、文字列がUnicode(nChar、nVarChar)またはASCII(Char、VarChar))であるかどうかを追跡する必要があることであり、 Unicode文字列のデータ長を2で割ります。

2
MikeTeeVee

残念ながら私が知っている完璧な解決策はありません。

提案されたソリューションの1つであるLEN(string + '.')-1は、文字列がサイズ4000または非Unicodeでサイズ8000のUnicodeの場合、誤った結果(-1)を返します。これは、連結が無視されるためです。必要に応じて、文字列をMAXサイズの文字列LEN(CAST(string as nvarchar(max)) + '.')-1にキャストすることでこれを克服できますが、それだけの価値はありますか?

他の人が述べたように、DATALENGTH(string)はストレージに使用されるバイト数を返します。 Unicode文字列の場合、結果を2で除算するだけでは不十分な場合があります nicodeサロゲート文字 は16ビットを超える場合があります。

全体として、各アプローチの制限に注意し、問題が少ないと思われるものを選択してください。

0
divega