web-dev-qa-db-fra.com

Combien de texte UTF-8 tient dans un champ "Texte" MySQL?

Selon MySQL, une colonne text contient 65 535 octets.

Donc, si c'est une limite légitime, cela ne correspondra-t-il qu'environ 32 000 caractères UTF-8, non? Ou est-ce une de ces limites "floues" où les gars qui ont écrit les documents ne peuvent pas distinguer les caractères des octets et il autorisera en fait ~ 64k caractères UTF-8 s'il est défini sur quelque chose comme utf8_general_ci?

47
Xeoncross

Une colonne text peut aller jusqu'à 65,535 octets.

Un utf-8 le caractère peut contenir jusqu'à 3 octets.

Donc ... votre limite réelle peut être 21,844 personnages.

Voir le manuel pour plus d'informations: http://dev.mysql.com/doc/refman/5.1/en/string-type-overview.html

Une chaîne de longueur variable. M représente la longueur maximale de colonne en caractères. La plage de M est de 0 à 65 535. La longueur maximale effective d'un VARCHAR dépend de la taille de ligne maximale (65 535 octets, qui est partagée entre toutes les colonnes) et du jeu de caractères utilisé. Par exemple, les caractères utf8 peuvent nécessiter jusqu'à trois octets par caractère, donc une colonne VARCHAR qui utilise le jeu de caractères utf8 peut être déclarée comme étant au maximum 21 844 caractères.

74
Wolph

Les caractères UTF-8 peuvent prendre jusqu'à 4 octets chacun, et non 2 comme vous le supposez. TF-8 est un codage à largeur variable , en fonction du nombre de bits significatifs dans le point de code Unicode:

  • 7 bits et moins dans le point de code Unicode: 1 octet en UTF-8
  • 8 à 11 bits: 2 octets en UTF-8
  • 12 à 16 bits: 3 octets
  • 17 à 21 bits: 4 octets

spécification UTF-8 d'origine permet d'encoder des valeurs Unicode jusqu'à 31 bits, en prenant jusqu'à 6 octets pour encoder sous forme UTF-8. Après que l'UTF-8 est devenu populaire, le consortium Unicode a déclaré qu'il n'utilisera jamais de points de code au-delà de 221- 1. Ceci est maintenant normalisé comme RFC 3629 .

MySQL actuellement (c'est-à-dire la version 5.6) ne prend en charge que les caractères Unicode Basic Multilingual Plane , pour lesquels UTF-8 nécessite jusqu'à 3 octets par caractère. Cela signifie que la réponse actuelle à votre question est que votre champ TEXT peut contenir au moins 21 844 caractères.

Selon la façon dont vous le regardez, les limites réelles sont supérieures ou inférieures à cela:

  • Si vous supposez, comme moi, que la limitation BMP sera finalement levée dans MySQL ou l'un de itsforks , vous ne devriez pas ' t compte pouvoir stocker plus de 16 383 caractères dans ce champ si votre client MySQL autorise la saisie arbitraire de texte Unicode.

  • D'un autre côté, vous pourrez peut-être exploiter le fait que UTF-8 est un codage à largeur variable. Si vous savez que votre texte est principalement en anglais simple avec juste le caractère non ASCII occasionnel, votre limite effective en pratique pourrait approcher la limite maximale de 64 Ko - 1 caractère.

11
Warren Young

Cependant, lorsqu'il est utilisé comme clé primaire, MySQL suppose que chaque limite de taille de colonne ajoute octets à la clé.

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

Eh bien, l'utilisation de longues colonnes de chaîne comme clé primaire est généralement une pratique de lit, mais j'ai rencontré ce problème lorsque je travaillais avec la base de données d'un produit commercial (!).

2
Danubian Sailor