2009-07-20 5 views
23

Ostatnio napotkałem problem przy użyciu len() w zapytaniu, aby dowiedzieć się długości kwerendy, len() nie zliczał spacji w wartości. Ale data-długość() również zlicza spacje końcowe.len() Vs długość danych() w sqlserver 2005

Czy to oznacza, że ​​jeśli wykonuję operację, która zajmuje się rzeczywistą długością wartości, to muszę użyć dalalength() nad len().

np .: Jeśli potrzebuję wartości o określonej wartości, to długość 10 znaków. tzn. jeśli wartość ma długość 3 znaków, muszę do niej dodać 7 spacji.

Pozdrowienia

Odpowiedz

16

Tak, dokładnie to musisz zrobić. Jeśli chcesz uzyskać liczbę znaków z wyłączeniem spacji, możesz użyć funkcji LEN(), podczas gdy we wszystkich pozostałych przypadkach DATALENGTH().

Nawet LEN() dokumentacja zawiera informację, że aby uzyskać liczbę bajtów do reprezentowania rozszerzenie trzeba zastosować DATALENGTH()

Oto linki do docs MSDN:

LEN()

DATALENGTH()

+2

i LEN() robi rzeczywiście ** ** TAKŻE spacji count ....... –

+0

LEN (N'testing jednego dwa trzy, nic g, ale test ") zwraca 41 znaków łącznie ze spacjami (i DATALENGTH() na tych zwrotach 82) –

+6

@ marc_s ... nie liczy jednak końcowych spacji. LEN ("HELLO"), LEN ("HELLO") i LEN ("HELLO") wracają kolejno 5, 5 i 10 razy. Jest to udokumentowane (""). –

30

Bądź ostrożny. DATALENGTH zwraca liczbę użytych bajtów, a nie liczbę znaków.

+6

+1 LEN na polu NVARCHAR zwraca liczbę znaków w łańcuchu, natomiast DATALENGTH() zwraca dwukrotnie tę liczbę (ponieważ NVARCHAR przechowuje 2 bajty na znak) –

+1

@marc_s Jesteś na miejscu , jak zawsze :) –

11

len zlicza liczbę znaków używanych nie przechowywanie wymagany, będzie to jeszcze bardziej widoczne, gdy używasz nvarchar zamiast varchar

len nie liczy spacje albo

przyjrzeć się tej

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


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

a wyjście len 3 a wyjście datalength = 10

2

Wystarczy użyć wymienić():

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

Spowoduje to zastąpienie spacji końcowych znakiem, który LEN() będzie się liczył.
Problem z DataLength() to, że musisz śledzić, czy twój ciąg znaków to Unicode (nChar, nVarChar) lub ASCII (Char, VarChar), aby wiedzieć, czy musisz również podzielić długość danych ciągu Unicode o 2.

0

Chciałem użyć podpowiedzi Len (zamień ("blah blah", "," '' ') , gdy uderzyło mnie, może być bardziej efektywne w użyciu.Z prostu zamieszczaj na wypadek, gdyby ktoś natknął się na ten wątek jako zrobiłem

len ('bla bla' + ''). - 1