MySQL - length () vs char_length ()

215

¿Cuál es la principal diferencia entre length()y char_length()?

Creo que tiene algo que ver con cadenas binarias y no binarias. ¿Hay alguna razón práctica para almacenar cadenas como binarias?

mysql> select length('MySQL'), char_length('MySQL');
+-----------------+----------------------+
| length('MySQL') | char_length('MySQL') |
+-----------------+----------------------+
|               5 |                    5 |
+-----------------+----------------------+
1 row in set (0.01 sec)
Yada
fuente
2
Sí, existen razones prácticas para almacenar cadenas binarias cuando en realidad son cadenas binarias, por ejemplo, comprimidas.
sanmai

Respuestas:

351

LENGTH()devuelve la longitud de la cadena medida en bytes .
CHAR_LENGTH()Devuelve la longitud de la cadena medida en caracteres .

Esto es especialmente relevante para Unicode, en el que la mayoría de los caracteres están codificados en dos bytes. O UTF-8, donde varía el número de bytes. Por ejemplo:

select length(_utf8 '€'), char_length(_utf8 '€')
--> 3, 1

Como puede ver, el signo del euro ocupa 3 bytes (está codificado como 0xE282ACen UTF-8) aunque solo sea un carácter.

Andomar
fuente
66
Solo UCS-2 está codificado en dos bytes por carácter. Esta codificación (o más exactamente UTF-16LE) es lo que Windows llama engañosamente "Unicode". MySQL no es compatible con UTF-16; en cambio, el enfoque habitual para colocar cadenas Unicode es usar UTF-8.
bobince
2
Por ejemplo: select length ('日本語'), char_length ('日本語');
sanmai
@bobince: Incluso UCS-2 codifica algunos caracteres en más de 2 bytes, por ejemplo 0313 combining comma above. Como a = 61, 0x00610313 se muestra como a̓ y ocupa 4 bytes.
Andomar
2
En realidad, según la terminología de Unicode, todavía hay 2 caracteres, aunque, como todas las marcas combinadas, puede, si hay una fuente adecuada disponible, representarse como un solo glifo. UTF-16LE todavía puede tener un carácter de 4 bytes, aunque gracias a los sustitutos.
bobince
66
Entonces, ¿cuál de estas funciones debo usar al descubrir cómo cambiar el tamaño de mis columnas VARCHAR? Al crear la tabla, digamos que una columna es un VARCHAR (10). ¿Permitirá eso un máximo de 10 caracteres o un máximo de 10 bytes?
still_dreaming_1
19

varchar (10) almacenará 10 caracteres, que pueden tener más de 10 bytes. En los índices, asignará la longitud máxima del campo, por lo que si está utilizando UTF8-mb4, asignará 40 bytes para el campo de 10 caracteres.

Brent
fuente