sql >> Base de Datos >  >> RDS >> Sqlserver

LEN() frente a DATALENGTH() en SQL Server

Al usar T-SQL en SQL Server (o Azure), LEN()DATALENGTH() Las funciones a menudo devolverán el mismo resultado, pero no siempre. Hay algunos casos en los que estas funciones devolverán resultados completamente diferentes para lo que parecen ser los mismos datos. Esto se debe a que existe una diferencia importante entre cómo LEN()DATALENGTH() las funciones funcionan, como veremos aquí.

Primero, aquí hay una definición rápida de cada uno:

LEN()
Devuelve el número de caracteres de la expresión de cadena especificada, excluyendo los espacios en blanco finales.
DATALENGTH()
Devuelve el número de bytes utilizados para representar cualquier expresión.

Tenga en cuenta "caracteres" frente a "bytes". También tenga en cuenta que "excluir los espacios en blanco finales" solo se aplica a uno.

Estos son algunos ejemplos para demostrar las diferencias entre LEN()DATALENGTH() .

Blancos finales

Una diferencia entre LEN()DATALENGTH() funciones es que LEN() función excluye espacios en blanco al final (espacios al final, tabulaciones, etc.) mientras que DATALENGTH() incluye espacios en blanco finales. Tenga en cuenta que solo estamos hablando de espacios en blanco que vienen al final de la cuerda, ni al principio ni en el medio.

Aquí hay un ejemplo sin espacios en blanco finales:

SELECT 
    LEN('Lit') AS Len,
    DATALENGTH('Lit') AS DataLength;

Resultado:

Len  DataLength
---  ----------
3    3   

Y aquí hay un ejemplo con espacios en blanco finales:

SELECT 
    LEN('Lit') AS Len,
    DATALENGTH('Lit') AS DataLength;

Resultado:

Len  DataLength
---  ----------
3    4  

Sin embargo, los espacios iniciales son contados por ambas funciones:

SELECT 
    LEN(' Lit') AS Len,
    DATALENGTH(' Lit') AS DataLength;

Resultado:

Len  DataLength
---  ----------
4    4         

Bytes frente a caracteres

Otra diferencia clave entre LEN()DATALENGTH() es que LEN() la función devuelve el número de caracteres en una cadena. Por otro lado, DATALENGTH() devuelve el número de bytes en una expresión.

Esta es una distinción importante porque la cantidad de bytes en una expresión no necesariamente coincide con la cantidad de caracteres en la cadena. Al procesar una cadena Unicode, DATALENGTH() devolverá el doble del número de caracteres. Esto se debe a que una cadena Unicode almacena 2 bytes por carácter.

En el ejemplo anterior, vimos que ambos LEN()DATALENGTH() devolvió el mismo resultado para la palabra Lit ( 3 ). Pero, una vez que comencemos a consultar una base de datos, el resultado dependerá de cómo se almacenen los datos. Por ejemplo, si está almacenado como varchar , los resultados serán los mismos. Si está almacenado como nvarchar el DATALENGTH() la función devolverá el doble del número de caracteres. Y si está almacenado como, por ejemplo, char(25)DATALENGTH() devolverá exactamente 25 caracteres.

Ejemplos

Ejecutemos la siguiente consulta:

SELECT 
    ArtistName, 
    LEN(ArtistName) AS Len,
    DATALENGTH(ArtistName) AS DataLength
FROM Artists 
WHERE ArtistName = 'Lit';

Los resultados de esta consulta dependerán de cómo se almacenen los datos.

nvarchar(255)

Si el ArtistName la columna almacena datos como nvarchar(255) :

ArtistName  Len  DataLength
----------  ---  ----------
Lit         3    6         

varchar(255)

Si cambiamos esa columna a varchar(255) , obtenemos el siguiente resultado:

ArtistName  Len  DataLength
----------  ---  ----------
Lit         3    3         

caracter(25)

Si cambiamos esa columna a char(25) , obtenemos el siguiente resultado:

ArtistName                 Len  DataLength
-------------------------  ---  ----------
Lit                        3    25        

Entonces, tal vez una moraleja de todo esto es, si obtiene resultados extraños al intentar recuperar longitudes de cadena, etc., verifique que esté usando la función correcta.