Quelle est la taille maximale de MySQL VARCHAR?

300

Je voudrais savoir quelle est la taille maximale d'un type MySQL VARCHAR.

J'ai lu que la taille maximale est limitée par la taille de la ligne qui est d'environ 65k. J'ai essayé de régler le champ sur varchar(20000)mais il dit que c'est trop grand.

Je pourrais le régler varchar(10000). Quel est le maximum exact auquel je peux le régler?

user1832628
la source
1
Un blog détaillé: goo.gl/Hli6G3
Suresh Kamrushi

Réponses:

293

Gardez à l'esprit que MySQL a une limite de taille de ligne maximale

La représentation interne d'une table MySQL a une limite de taille de ligne maximale de 65 535 octets, sans compter les types BLOB et TEXT. Les colonnes BLOB et TEXT ne contribuent que de 9 à 12 octets à la limite de taille de ligne car leur contenu est stocké séparément du reste de la ligne. En savoir plus sur les limites du nombre de colonnes du tableau et de la taille des lignes.

La taille maximale qu'une seule colonne peut occuper est différente avant et après MySQL 5.0.3

Les valeurs des colonnes VARCHAR sont des chaînes de longueur variable. La longueur peut être spécifiée sous la forme d'une valeur de 0 à 255 avant MySQL 5.0.3 et de 0 à 65 535 dans 5.0.3 et versions ultérieures. La longueur maximale effective d'un VARCHAR dans MySQL 5.0.3 et versions ultérieures est soumise à la taille de ligne maximale (65 535 octets, qui est partagée entre toutes les colonnes) et au jeu de caractères utilisé.

Cependant, notez que la limite est inférieure si vous utilisez un jeu de caractères multi-octets comme utf8 ou utf8mb4.

Utilisez des TEXTtypes afin de dépasser la limite de taille de ligne.

Les quatre types de TEXTE sont TINYTEXT, TEXT, MEDIUMTEXT et LONGTEXT. Celles-ci correspondent aux quatre types de BLOB et ont les mêmes longueurs maximales et exigences de stockage.

Plus de détails sur les types BLOB et TEXT

Encore plus

Commander plus de détails sur Type de données Exigences de stockage qui traite des besoins de stockage pour tous les types de données.

rajukoyilandy
la source
4
qu'est-ce qu'une chaîne "longue"?
Richard H
6
J'essaie cependant d'éviter les colonnes TEXT car elles peuvent entraîner la création de tables temporaires lorsqu'elles sont présentes et triées
Robert Swisher
1
Si je prends varchar (200) pour le prénom et que je ne stocke que 6 caractères dans ce champ, alors combien d'octets le prénom sera-t-il occupé?
Paresh Gami
2
@PareshGami - 6 + 1 = 7 caractères! Contrairement à CHAR, les valeurs VARCHAR sont stockées sous la forme d'un préfixe de longueur 1 octet ou 2 octets plus des données. plus ...
rajukoyilandy
58

Selon les documents en ligne , il y a une limite de 64 Ko et vous pouvez déterminer la taille de la ligne en utilisant:

row length = 1
             + (sum of column lengths)
             + (number of NULL columns + delete_flag + 7)/8
             + (number of variable-length columns)

Vous devez garder à l'esprit que les longueurs de colonne ne sont pas un mappage un à un de leur taille. Par exemple, CHAR(10) CHARACTER SET utf8nécessite trois octets pour chacun des dix caractères, car cet encodage particulier doit prendre en compte la propriété de trois octets par caractère de utf8(c'est l' utf8encodage de MySQL plutôt que le "vrai" UTF-8, qui peut avoir jusqu'à quatre octets ).

Mais, si la taille de votre ligne approche 64 Ko, vous souhaiterez peut-être examiner le schéma de votre base de données. C'est une table rare qui doit être aussi large dans une base de données correctement configurée (3NF) - c'est possible, mais pas très courant.

Si vous souhaitez utiliser plus que cela, vous pouvez utiliser les types BLOBou TEXT. Ceux-ci ne comptent pas dans la limite de 64 Ko de la ligne (autre qu'une petite empreinte administrative), mais vous devez être conscient des autres problèmes qui découlent de leur utilisation, tels que le fait de ne pas pouvoir trier en utilisant tout le bloc de texte au-delà d'un certain nombre. de caractères (bien que cela puisse être configuré vers le haut), forçant les tables temporaires à être sur le disque plutôt que dans la mémoire, ou à configurer des tampons de communication client et serveur pour gérer efficacement les tailles.

Les tailles autorisées sont:

TINYTEXT          255 (+1 byte  overhead)
TEXT          64K - 1 (+2 bytes overhead)
MEDIUMTEXT    16M - 1 (+3 bytes overhead)
LONGTEXT      4G  - 1 (+4 bytes overhead)

Vous avez toujours l'inadéquation octet / caractère (de sorte qu'une MEDIUMTEXT utf8colonne peut stocker "seulement" environ un demi-million de caractères (16M-1)/3 = 5,592,405), mais elle étend encore considérablement votre plage.

paxdiablo
la source
4
Gardez à l'esprit que les types TEXT ne peuvent PAS être stockés dans des tables de mémoire, il y a donc une pénalité de performance importante pour les utiliser lorsqu'un VARCHAR suffit.
Camden
'la propriété de trois octets par caractère de utf8' de MySql utf8 , qui n'est en fait pas du tout utf8. En réalité, le max. octets dans un caractère utf-8 est 4 . Pour cette raison, vous devez toujours définir l'encodage utf8mb4dans MySQL . utf8mb4est le nom de MySql pour ce que le reste du mot appelle utf8.
Stijn de Witt
1
@StijndeWitt, merci pour cela. clarifié pour indiquer que je voulais dire la méthode de codage utf8 de MySQL plutôt que UTF-8. J'utilise généralement la variante en majuscule pour indiquer le "vrai" UTF-8 puisque c'est la convention IANA acceptée.
paxdiablo
41

La source

La longueur maximale d'un varchar est soumise à la taille de ligne maximale dans MySQL, qui est de 64 Ko (sans compter les BLOB):

VARCHAR (65535) Cependant, notez que la limite est inférieure si vous utilisez un jeu de caractères multi-octets:

VARCHAR (21844) JEU DE PERSONNAGES utf8

Attila
la source
21
Veuillez cesser d'utiliser CHARACTER SET utf8dans les exemples. Cela devrait être CHARACTER SET utf8mb4(si vous voulez que tout le texte Unicode soit stocké correctement ... et qui ne veut pas cela?)
Stijn de Witt
4
Pour CHARSET=utf8mb4utilisation VARCHAR(16383).
Wil Moore III
3
L'utilisation de utf8mb4 vous placera contre la limite de largeur d'index dans une situation où utf8 ne le fait pas. Si vous examinez les jeux de caractères inclus dans utf8mb4 mais pas dans utf8, vous constaterez peut-être que l'inclusion de toutes les formes de hiéroglyphes et d'autres jeux de caractères obscurs ne vaut pas la pénalité de performance significative (déterminée empiriquement). Ce n'est pas aussi coupé et séché que Stijn le laisse entendre.
kcrossen
De nombreux emojis sont également présents dans utf8mb4 et manquants dans utf8, ce qui peut changer l'équation de la pertinence.
Brian Morearty
23

De la documentation MySQL:

La longueur maximale effective d'un VARCHAR dans MySQL 5.0.3 et versions ultérieures est soumise à la taille de ligne maximale (65 535 octets, partagée entre toutes les colonnes) et au jeu de caractères utilisé. Par exemple, les caractères utf8 peuvent nécessiter jusqu'à trois octets par caractère, de sorte qu'une colonne VARCHAR qui utilise le jeu de caractères utf8 peut être déclarée être au maximum 21 844 caractères.

Les limites pour le VARCHAR varient en fonction du jeu de caractères utilisé. Utiliser ASCII utiliserait 1 octet par caractère. Cela signifie que vous pouvez stocker 65 535 caractères. L'utilisation d'utf8 utilise 3 octets par caractère, ce qui donne une limite de 21 844 caractères. MAIS si vous utilisez le jeu de caractères multi-octets moderne utf8mb4 que vous devriez utiliser! Il prend en charge les emojis et autres caractères spéciaux. Il utilisera 4 octets par caractère. Cela limitera le nombre de caractères par table à 16 383. Notez que d'autres champs tels que INT seront également comptés dans ces limites.

Conclusion:

utf8 maximum 21 844 caractères

utf8mb4 maximum de 16 383 caractères

Firze
la source
6

vous pouvez également utiliser MEDIUMBLOB / LONGBLOB ou MEDIUMTEXT / LONGTEXT

Un type BLOB dans MySQL peut stocker jusqu'à 65 534 octets, si vous essayez de stocker plus que cela, MySQL tronquera les données. MEDIUMBLOB peut stocker jusqu'à 16 777 213 octets et LONGBLOB peut stocker jusqu'à 4 294 967 292 octets.

SRIRAM
la source
3

Avant la version 5.0.3 de Mysql, le type de données Varchar peut stocker 255 caractères, mais à partir de la version 5.0.3, il peut contenir 65 535 caractères.

MAIS il a une limitation de la taille maximale des lignes de 65 535 octets. Cela signifie que, y compris toutes les colonnes, il ne doit pas dépasser 65 535 octets.

Dans votre cas, il est possible que lorsque vous essayez de définir plus de 10000, il dépasse plus de 65 535 et mysql donnera l'erreur.

Pour plus d'informations: https://dev.mysql.com/doc/refman/5.0/en/column-count-limit.html

blog avec exemple: http://goo.gl/Hli6G3

Suresh Kamrushi
la source
-5

Vous pouvez utiliser le TEXTtype , qui n'est pas limité à 64 Ko.

mvp
la source
31
Cela ne répond pas à la question.
DreamWave
1
Votre réponse n'est pas pertinente pour la question.
Girish