2010-12-12 18 views
44

Según MySQL, una columna text tiene 65.535 bytes.¿Cuánto texto UTF-8 cabe en un campo MySQL "Texto"?

Entonces, si esto es un límite legítimo, ¿realmente solo cabe alrededor de 32k caracteres UTF-8, ¿verdad? ¿O es este uno de esos límites "borrosos" donde los tipos que escribieron los documentos no pueden distinguir los caracteres de los bytes y realmente permitirán ~ 64k caracteres UTF-8 si se establece en algo como utf8_general_ci?

+5

respuesta corta para sus ojos: esto --- --- http://pastebin.com/eYUPppw6 (21844 caracteres de 3 bytes UTF-8) – Sharky

Respuesta

70

Una columna text puede ser hasta 65,535 bytes.

Un carácter utf-8 puede tener hasta 3 bytes.

Entonces ... su límite real puede ser 21,844 caracteres.

Consulte el manual para más información: http://dev.mysql.com/doc/refman/5.1/en/string-type-overview.html

Una cadena de longitud variable. M representa la longitud máxima de columna en caracteres. El rango de M es 0 a 65,535. La longitud máxima efectiva de un VARCHAR está sujeta al tamaño máximo de fila (65.535 bytes, que es compartido entre todas las columnas) y el conjunto de caracteres utilizado. Por ejemplo, los caracteres utf8 pueden requerir hasta tres bytes por carácter, por lo que una columna VARCHAR que utiliza el conjunto de caracteres utf8 puede declararse como un máximo de 21,844 caracteres.

+6

4 bytes, no 3: http://en.wikipedia.org/wiki/Utf-8 –

+2

un char utf-8 puede tener hasta 4 bytes, y eventualmente puede ser 5 o más, una vez que todos los conjuntos de caracteres extragalácticos se agregan a Unicode: ^) –

+0

¿De dónde sacas esto "hasta 3 bytes "figura? La codificación UTF-8 de un punto de código puede usar de 1 a 4 bytes. – Thanatos

11

Los caracteres UTF-8 pueden ocupar hasta 4 bytes cada uno, no 2 como usted supone. UTF-8 is a variable-width encoding, en función del número de bits significativos en el punto de código Unicode:

  • 7 bits y bajo en el punto de código Unicode: 1 byte en UTF-8
  • 8 a 11 bits: 2 bytes en UTF 8
  • 12 a 16 bits: 3 bytes
  • 17 a 21 bits: 4 bytes

El original UTF-8 spec permite codificar hasta valores Unicode de 31 bits, teniendo un máximo de 6 bytes para codificar en UTF 8 forma. Después de que UTF-8 se hizo popular, el Consorcio Unicode declaró que nunca usarán puntos de código más allá de 2 & thinsp; - & thinsp; 1. Esto ahora está estandarizado como RFC 3629.

MySQL currently (es decir, la versión 5.6) solo admite los caracteres Unicode Basic Multilingual Plane, para los cuales UTF-8 necesita hasta 3 bytes por carácter. Eso significa que la respuesta actual a su pregunta es que su campo TEXT puede contener al menos 21,844 caracteres.

Dependiendo de cómo se mire, los límites reales son superiores o inferiores a lo siguiente:

  • Si se supone, como yo, que la limitación BMP, finalmente, se levantará en MySQL o una de itsforks, no debe contar con poder almacenar más de 16,383 caracteres en ese campo si su cliente MySQL permite la entrada de texto Unicode arbitraria.

  • Por otro lado, puede aprovechar el hecho de que UTF-8 es una codificación de ancho variable. Si sabe que su texto es en su mayoría inglés simple con solo caracteres ocasionales que no son ASCII, su límite efectivo en la práctica podría acercarse al límite máximo de 64 & thinsp; KB & thinsp; - & thinsp; 1 carácter.

+0

"solo se puede suponer que el campo puede contener hasta 16K * caracteres * de texto UTF-8". ← Aclaro que ... – Thanatos

+0

Solucionado. Gracias, Thanatos. –

1

Sin embargo, cuando se utiliza como clave principal , MySQL asume que cada límite de tamaño de la columna agrega 3 bytes a la clave.

mysql> alter table test2 modify code varchar(333) character set utf8; 
Query OK, 0 rows affected (0.05 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> alter table test2 modify code varchar(334) character set utf8; 
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes 

Bueno, utilizando columnas de cadena larga como clave primaria es generalmente una práctica cama, sin embargo he encontré con ese problema cuando se trabaja con la base de datos de un producto comercial (!).

Cuestiones relacionadas