En MySQL, si creo un nuevo VARCHAR(32)
campo en una tabla UTF-8, ¿significa que puedo almacenar 32 bytes de datos en ese campo o 32 caracteres (multibyte)?
En MySQL, si creo un nuevo VARCHAR(32)
campo en una tabla UTF-8, ¿significa que puedo almacenar 32 bytes de datos en ese campo o 32 caracteres (multibyte)?
Respuestas:
Esta respuesta apareció en la parte superior de los resultados de búsqueda de Google, pero no fue correcta, por lo que:
La confusión probablemente se deba a que se están probando diferentes versiones de mysql.
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 posteriores 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 usa el juego de caracteres utf8 se puede declarar con un máximo de 21,844 caracteres.
utf8mb4
) puede almacenar "💩💩💩💩💩💩💩💩💩💩" (10 pilas de caca), eso es 10 caracteres pero 40 bytes.
le permitiría almacenar 32 caracteres multibyte
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 utf8 CHAR CHARACTER SET porque esa es la longitud máxima posible. Por ejemplo, MySQL debe reservar 30 bytes para una columna CHAR (10) CHARACTER SET utf8.
CHAR
y cuando lo hago no está destinado a almacenar caracteres de varios bytes, así que estoy a salvo. ¿ VARCHAR
Está seguro de que el límite está definido en caracteres de varios bytes y no en caracteres de un solo byte?
32 datos multibytes para la varchar(32)
intercalación utf8_unicode_ci
, acabo de probar con XAMPP.
1234567890123456789012345678901234567890
Truncar a:
12345678901234567890123456789012
Tenga en cuenta que estos no son caracteres ASCII normales.
utf8
, pero luego obtiene un soporte Unicode roto en MySQL. Debería usar utf8mb4
codificación en su lugar, porque hay un máximo de. 4 bytes en un carácter utf-8 , no 3 como en la variante de utf8 de MySQL ...
Es mejor usar "char" para tablas de actualización muy frecuentes porque la longitud total de datos de la fila será fija y rápida. Las columnas Varchar hacen que los tamaños de los datos de las filas sean dinámicos. Eso no es bueno para MyISAM, pero no sé nada de InnoDB y otros. Por ejemplo, si tiene una columna de "tipo" muy estrecha, puede ser mejor usar char (2) con el juego de caracteres latin1 para reclamar solo un espacio mínimo.
CHAR
. Para InnoDB, están sucediendo tantas otras cosas que el debate sobre "tamaño de fila dinámico / fijo" es esencialmente irrelevante.
CHAR
.
Si se conecta a la base de datos utilizando la 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 pero 64 bytes y la columna es VARCHAR(32)
UTF8, la codificación doble convertirá la cadena $s
en una cadena UTF8 de 64 caracteres que se truncará en la base de datos a sus 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 del mismo efecto.