2009-07-20 4 views
23

Recentemente ho riscontrato un problema durante l'utilizzo di len() in una query per scoprire la lunghezza di una query, len() non stava contando gli spazi finali nel valore. Ma datalength() sta anche contando gli spazi finali.len() Vs datalength() in sqlserver 2005

Ciò significa che se eseguo un'operazione che riguarda la lunghezza effettiva del valore, allora devo usare dalalength() su len().

ex: Se ho bisogno che il valore di un particolare valore sia di 10 caratteri. cioè se il valore è di 3 caratteri, devo aggiungere 7 spazi.

Saluti

risposta

16

Sì, è esattamente quello che devi fare. Se si desidera ottenere solo il numero di caratteri esclusi gli spazi vuoti, si utilizzerà la funzione LEN(), mentre in tutti gli altri casi DATALENGTH().

Anche LEN() documentazione ha un informazioni che per ottenere il numero di byte per rappresentare l'estensione si dovrebbe usare DATALENGTH()

Ecco i link a documentazione MSDN:

LEN()

DATALENGTH()

+2

e LEN() effettivamente ** ** ANCHE spazi bianchi conteggio ....... –

+0

LEN (N'testing uno due tre, niente ma un test ') restituisce 41 caratteri incluso lo spazio bianco (e DATALENGTH() su quello restituisce 82) –

+6

@marc_s ... non conta gli spazi bianchi finali. LEN ('HELLO'), LEN ('HELLO') e LEN ('HELLO') restituiscono 5, 5 e 10 consecutivamente. Questo è documentato (""). –

30

Stai attento. DATALENGTH restituisce il numero di byte utilizzati, non il numero di caratteri.

+6

+1 LEN su un campo NVARCHAR restituisce il numero di caratteri nella stringa, mentre DATALENGTH() restituisce il doppio di quel numero (poiché NVARCHAR memorizza 2 byte per carattere) –

+1

@marc_s , come sempre :) –

11

len conta il numero di caratteri utilizzati non l'archiviazione richiesto, questo sarà ancora più evidente quando si utilizza nvarchar invece di varchar

len non conta gli spazi finali o

un'occhiata a questo

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


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

e l'uscita per len è 3, mentre l'uscita per la lunghezza dati = 10

2

Basta usare Replace():

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

Questo sostituirà gli spazi finali con un carattere che LEN() conterà effettivamente.

Il problema con DataLength() è che è necessario tenere traccia di se la propria stringa è Unicode (nChar, nVarChar) o ASCII (Char, VarChar) per sapere se è anche necessario dividere la lunghezza dei dati di una stringa Unicode per 2.

0

Stavo per usare il suggerimento Len (Replace ('blah blah', '', '_') quando mi ha colpito potrebbe essere più efficiente da usare. Pubblicare solo nel caso in cui qualcuno si imbatta in questo thread come ho fatto

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