2009-11-14 21 views
155

¿Cuál es la principal diferencia entre length() y char_length()?MySQL - length() vs 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) 
+0

Sí, hay razones prácticas para almacenar cadenas binarias cuando en realidad son cadenas binarias, p. comprimido. – sanmai

Respuesta

257

LENGTH() devuelve la longitud de la cadena medido 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 se puede ver el símbolo del Euro ocupa 3 bytes (se codifica como 0xE282AC en UTF-8) a pesar de que es sólo un carácter.

+3

Solo UCS-2 está codificado en dos bytes por carácter. Esta codificación (o más exactamente UTF-16LE) es lo que Windows denomina engañosamente "Unicode". MySQL no es compatible con UTF-16; en cambio, el enfoque habitual para poner cadenas Unicode en él es usar UTF-8. – bobince

+2

Por ejemplo: seleccione la longitud ('日本語'), char_length ('日本語'); – sanmai

+1

yesh! otro ejemplo: 'length ('华语')' versus 'char_length ('华语')' –

9

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.