sql >> Base de Datos >  >> RDS >> Mysql

MySQL longitud () frente a char_length ()

En MySQL, hay muchas ocasiones en las que length() función y el char_length() La función proporcionará exactamente los mismos resultados. Sin embargo, también hay momentos en los que los resultados serán completamente diferentes. Este es el motivo.

Primero, aquí está la definición de cada una de estas funciones:

char_length()
Devuelve la longitud de una cadena, medida en caracteres.
length()
Devuelve la longitud de una cadena, medida en bytes.

Observe "caracteres" frente a "bytes":uno se mide en caracteres , el otro se mide en bytes .

En muchos casos, la cantidad de bytes será la misma que la cantidad de caracteres en la cadena, pero no siempre es así. El número de bytes utilizados por carácter depende de cómo se almacenen los datos. Por ejemplo, si la cadena se almacena como datos Unicode, habrá 2 bytes por carácter.

Aquí hay un ejemplo básico usando texto ASCII (donde ambas funciones devuelven el mismo resultado):

SELECT 
    CHAR_LENGTH('Lit'), 
    LENGTH('Lit');

Resultado:

+--------------------+---------------+
| CHAR_LENGTH('Lit') | LENGTH('Lit') |
+--------------------+---------------+
|                  3 |             3 |
+--------------------+---------------+

Y a menudo obtendremos el mismo resultado si la cadena se almacena en una base de datos:

SELECT 
    CHAR_LENGTH(ArtistName),
    LENGTH(ArtistName)    
FROM Artists
WHERE ArtistName = 'Lit';

Resultado:

+-------------------------+--------------------+
| CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) |
+-------------------------+--------------------+
|                       3 |                  3 |
+-------------------------+--------------------+

Sin embargo, si cambiamos la columna de la base de datos para almacenar los datos como Unicode:

ALTER TABLE Artists 
MODIFY COLUMN ArtistName VARCHAR(255) unicode;

Y luego ejecuta la misma consulta de nuevo:

SELECT 
    CHAR_LENGTH(ArtistName),
    LENGTH(ArtistName)    
FROM Artists
WHERE ArtistName = 'Lit';

Obtenemos un resultado diferente:

+-------------------------+--------------------+
| CHAR_LENGTH(ArtistName) | LENGTH(ArtistName) |
+-------------------------+--------------------+
|                       3 |                  6 |
+-------------------------+--------------------+

Esto se debe a que Unicode almacena cada carácter como 2 bytes.

Esto es similar a la diferencia entre datalength() y len() en T-SQL.

MySQL también tiene octet_length() función, que es un sinónimo de length() .