MySQL – length () versus char_length ()

¿Cuál es la diferencia principal 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) 

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 0xE282AC en UTF-8) aunque solo 0xE282AC un carácter.

varchar (10) almacenará 10 caracteres, que pueden ser 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.