2009-07-20 3 views
23

Недавно я столкнулся с проблемой при использовании len() в запросе, чтобы узнать длину запроса, len() не считал конечные пробелы в значении. Но datalength() также подсчитывает конечные пробелы.len() Vs datalength() в sqlserver 2005

Означает ли это, что если я выполняю некоторую операцию, которая имеет дело с фактической длиной значения, тогда я должен использовать dalalength() над len().

ex: Если мне нужно, чтобы значение определенного значения составляло 10 символов. т.е. если значение равно 3 символам, я должен добавить к нему 7 пробелов.

С уважением

ответ

16

Да, это именно то, что вы должны делать. Если вы хотите просто получить количество символов, исключая пробелы, вы должны использовать функцию LEN(), а во всех остальных случаях - DATALENGTH().

Даже LEN() документация имеет информацию, чтобы получить число байтов, чтобы представить расширение, которое вы должны использовать DATALENGTH()

Вот ссылки на MSDN документы:

LEN()

DATALENGTH()

+2

и LEN() действительно ** ТАКЖЕ ** COUNT ....... –

+0

пробельные символы LEN (N'testing один два три, ничего g, но тест ') возвращает 41 символ, включая пробельные символы (и DATALENGTH(), который возвращает 82) –

+6

@marc_s ... однако он не учитывает конечные пробелы. LEN («HELLO»), LEN («HELLO») и LEN («HELLO») возвращают 5, 5 и 10 последовательно. Это задокументировано (""). –

30

Быть осторожен. DATALENGTH возвращает количество используемых байтов, а не количество символов.

+6

+1 LEN в поле NVARCHAR возвращает количество символов в строке, а DATALENGTH() возвращает дважды это число (поскольку NVARCHAR хранит 2 байта на символ) –

+1

@marc_s Вы находитесь на , как всегда :) –

11

Len подсчитывает количество символов, используемых не для хранения требуется, это будет еще более очевидным, когда вы используете NVARCHAR вместо VARCHAR

Len не учитывает хвостовые пробелы либо

взглянуть на эту

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


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

и выход для Len равен 3, а выход для DATALENGTH = 10

2

Просто используйте Заменить():

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

Это заменит конечные пробелы символом, который LEN() будет фактически считать.

Проблема с DataLength() заключается в том, что вам нужно отслеживать, что ваша строка - это Unicode (nChar, nVarChar) или ASCII (Char, VarChar), чтобы знать, нужно ли также разделять длину данных строки Unicode на 2.

0

Я уже собирался использовать Len (Replace ('blah blah', '', '_') предложение, когда оно меня поразило, это может быть более эффективно использовать. Просто отправляйте сообщение, если кто-то наткнулся на эту ветку как Я сделал

Len ('бла-бла' + '') -. 1

Смежные вопросы