data - mysql text vs varchar
Longitudes VARCHAR de MySQL y UTF-8 (5)
En MySQL, si creo un nuevo campo VARCHAR(32)
en una tabla UTF-8 ¿significa que puedo almacenar 32 bytes de datos en ese campo o 32 caracteres (multibyte)?
32 datos multibytes para varchar(32)
con colación utf8_unicode_ci
, acabo de probar con XAMPP.
1234567890123456789012345678901234567890
Obtener truncado a:
12345678901234567890123456789012
Tenga en cuenta que estos no son caracteres ASCII regulares.
Es mejor usar "char" para las tablas de actualización frecuentes porque la longitud total de datos de la fila será fija y rápida. Las columnas Varchar hacen dinámicos los tamaños de datos de fila. Eso no es bueno para MyISAM, pero no sé sobre InnoDB y otros. Por ejemplo, si tiene una columna "tipo" muy estrecha, puede ser mejor usar char (2) con latin1 charset para reclamar solo un espacio mínimo.
Esta respuesta apareció en la parte superior de mis resultados de búsqueda de Google, pero no era correcta, así que:
La confusión probablemente se deba a diferentes versiones de mysql que se prueban.
- La versión 4 cuenta los bytes
- La versión 5 cuenta personajes
http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html
MySQL interpreta las especificaciones de longitud en las definiciones de columnas de caracteres en unidades de caracteres. (Antes de MySQL 4.1, las longitudes de las columnas se interpretaban en bytes). Esto se aplica a los tipos CHAR, VARCHAR y TEXT.
Curiosamente (no lo había pensado) la longitud máxima de una columna varchar se ve afectada por utf8 de la siguiente manera:
La longitud máxima efectiva de un VARCHAR en MySQL 5.0.3 y posterior está sujeta al tamaño máximo de fila (65.535 bytes, que se comparte entre todas las columnas) y al juego de caracteres utilizado. Por ejemplo, los caracteres utf8 pueden requerir hasta tres bytes por carácter, por lo que una columna VARCHAR que use el conjunto de caracteres utf8 puede declararse como un máximo de 21,844 caracteres.
Si se conecta a la base de datos utilizando codificación latin1 (por ejemplo, con PHP) para guardar una cadena PHP UTF8 en una columna MySQL UTF8, tendrá una codificación doble UTF8.
Si la cadena UTF8 $s
tiene 32 caracteres de longitud pero 64 bytes de longitud y la columna es VARCHAR(32)
UTF8, la codificación doble convertirá la cadena $s
a una cadena UTF8 de 64 caracteres que se truncará en la base de datos a su 32 primeros caracteres correspondientes a los 32 primeros bytes de $s
. Puede terminar pensando que MySQL 5 se comporta como MySQL 4, pero de hecho es una segunda causa para el mismo efecto.
te dejaría almacenar 32 caracteres multi-byte
Para ahorrar espacio con UTF-8, use VARCHAR en lugar de CHAR. De lo contrario, MySQL debe reservar tres bytes para cada carácter en una columna de CHAR CHARTER SET utf8 porque esa es la longitud máxima posible. Por ejemplo, MySQL debe reservar 30 bytes para CHAR (10) CHARACTER SET columna utf8.