Domanda

Di recente ho dovuto affrontare un problema quando si utilizza len() in una query per scoprire la lunghezza di una query, len() non stava contando gli spazi finali nel valore. Ma datalength() sta contando anche gli spazi finali.

Fa questo significa che se sto facendo qualche operazione che si occupa della lunghezza effettiva del valore allora devo usare dalalength() sopra len().

es: Se ho bisogno il valore di un particolare valore di essere è di 10 lunghezza dei caratteri. vale a dire se il valore è 3 lunghezza del carattere non ho da aggiungere 7 spazi ad esso.

È stato utile?

Soluzione

Si è esattamente quello che si deve fare. Se si vuole solo ottenere il numero di caratteri escluse le schede bianche si usa la funzione LEN(), mentre in tutti gli altri casi DATALENGTH().

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

Ecco i link a documentazione MSDN:

LEN ()

DATALENGTH ()

Altri suggerimenti

Fai attenzione. DATALENGTH restituisce il numero di byte usati, non il numero di caratteri.

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

dare 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 datalength = 10

Basta usare replace ():

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

Questo sostituirà gli spazi finali con un carattere che LEN () sarà effettivamente contare.
Il problema con DataLength () è che devi tenere traccia di montone stringa è Unicode (nChar, nvarchar) o ASCII (Char, VarChar) per sapere se anche è necessario dividere la lunghezza dati di una stringa Unicode per 2.

Stavo per usare il Len (Replace ( 'bla bla','', '_') suggerimento quando mi ha colpito, può essere più efficiente utilizzare. Proprio distacco in caso qualcuno si imbatte in questa discussione come ho fatto io.

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

Purtroppo non esiste una soluzione perfetta che io sia a conoscenza.

Una delle soluzioni proposte, LEN(string + '.')-1 restituisce risultati errati (-1) se la stringa è Unicode del formato 4000 o non Unicode e di dimensioni 8000. Questo perché la concatenazione viene ignorato. È possibile superare questo se si vuole, lanciando la stringa in una stringa MAX-size:? LEN(CAST(string as nvarchar(max)) + '.')-1, ma ne vale la pena

Come detto da altri, DATALENGTH(string) restituisce il numero di byte utilizzati per lo stoccaggio. Per le stringhe Unicode, potrebbe non essere sufficiente per dividere il risultato per 2: Unicode caratteri surrogati può richiedere più di 16 bit.

Tutto sommato, essere consapevoli dei limiti di ogni approccio e scegliere quello che credi ti farà meno problemi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top