entre - Len() vs datalength() en SQL Server 2005
sql server text length (6)
Desafortunadamente, no hay una solución perfecta que yo sepa.
Una de las soluciones propuestas, LEN(string + ''.'')-1
devuelve resultados incorrectos (-1) si la cadena es Unicode de tamaño 4000 o no Unicode y de tamaño 8000. Esto se debe a que se ignora la concatenación. Puede superar esto si lo desea, convirtiendo la cadena en una cadena de tamaño MAX: LEN(CAST(string as nvarchar(max)) + ''.'')-1
, pero ¿vale la pena?
Como lo mencionaron otros, DATALENGTH(string)
devuelve el número de bytes utilizados para el almacenamiento. Para las cadenas Unicode, puede que no sea suficiente dividir el resultado entre 2: los caracteres sustitutos de Unicode pueden tomar más de 16 bits.
En definitiva, tenga en cuenta las limitaciones de cada enfoque y elija lo que crea que le causará menos problemas.
Recientemente enfrenté un problema al usar len()
en una consulta para averiguar la longitud de una consulta, len()
no contaba los espacios finales en el valor. Pero datalength()
cuenta los espacios finales.
Esto significa que si estoy haciendo alguna operación que se ocupa de la longitud real del valor, entonces tengo que usar dalalength()
sobre len()
.
Por ejemplo: si necesito que el valor de un valor particular sea de 10 caracteres de longitud. es decir, si el valor es de 3 caracteres, tengo que añadirle 7 espacios.
Saludos
Estaba a punto de usar la sugerencia de Len (Reemplazar (''blah blah'', '''', ''_'') cuando me llamó la atención, puede ser más eficiente de usar. Solo publicar en caso de que alguien se tope con este hilo como yo.
len (''blah blah'' + ''.'') - 1
Sí, eso es exactamente lo que debes hacer. Si solo desea obtener un número de caracteres que excluyan espacios en blanco, usará la función LEN()
, mientras que en todos los demás casos DATALENGTH()
.
Incluso la documentación de LEN()
tiene una información que para obtener el número de bytes que representa la extensión, debe usar DATALENGTH()
Aquí están los enlaces a los documentos de MSDN:
Solo usa Reemplazar ():
SELECT LEN(REPLACE(N''4 Trailing Spaces: '', '' '', ''_''))
Esto reemplazará los espacios finales con un carácter que LEN () realmente contará.
El problema con DataLength () es que debe hacer un seguimiento de si su cadena es Unicode (nChar, nVarChar) o ASCII (Char, VarChar) para saber si también necesita dividir la longitud de la cadena de datos de Unicode entre 2.
Ten cuidado. DATALENGTH() devuelve el número de bytes utilizados, no el número de caracteres.
len cuenta la cantidad de caracteres utilizados, no el almacenamiento requerido, esto será aún más evidente cuando use nvarchar en lugar de varchar
len tampoco cuenta los espacios finales
mira esto
declare @v nchar(5)
select @v =''ABC ''
select len(@v),datalength(@v)
y la salida para len es 3 mientras que la salida para datalength = 10