Si j'ai une colonne dans la table avec un champ de type VARCHAR(15)
et si j'essaie d'insérer des données de longueur 16, MySQL donne une erreur indiquant
Data too long for column 'testname' at row 1
Est-ce que quelqu'un sait pourquoi les champs VARCHAR dans MySQL prennent une longueur fixe? De plus, combien d'octets un champ VARCHAR prend-il par enregistrement en fonction de la taille donnée?
Si vous définissez une colonne sur varchar(15)
, le nombre maximal d'octets autorisé est de 15. Ainsi, vous ne pouvez pas lui transmettre plus de 15 caractères sans modifier la colonne pour en prendre en charge plus de 15. Si vous stockez une chaîne de 4 caractères, ne devrait utiliser qu'environ 4 octets sur 15 possibles, alors que si vous aviez utilisé char(15)
, il aurait rempli les 11 autres octets vides.
http://dev.mysql.com/doc/refman/5.0/en/char.html
(Mon calcul d'octet était probablement désactivé car il est toujours -1/+ 1 ou quelque chose comme ça).
Depuis le Manuel MySQL 5. :
Les valeurs des colonnes VARCHAR sont des chaînes de longueur variable. La longueur peut être spécifiée comme 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é.
Je n'utilise VARCHAR que lorsque je suis certain que les données que la colonne doit contenir ne dépasseront jamais une certaine longueur, et même dans ce cas, je suis prudent. Si je stocke une chaîne de texte, j'ai tendance à utiliser l'un des types TEXT.
Consultez MySQL Storage Requirements pour plus d'informations sur la façon dont les octets sont utilisés.
Petite note locale supplémentaire. Le nombre d'octets utilisés dépendra du schéma de codage utilisé. 1 octet par caractère en encodage latin1, mais jusqu'à 3 en UTF8. Voir le lien dans la réponse de mlambie pour plus de détails.
Si vous regardez ici, cela devrait vous dire tout sur varchar que vous voulez savoir: http://dev.mysql.com/doc/refman/5.0/en/char.html
Fondamentalement, en fonction de la longueur que vous avez choisie, il utilisera 1 ou deux octets pour suivre la longueur de la chaîne actuelle dans cette colonne, de sorte qu'il stockera le nombre d'octets pour les données que vous insérez, plus un ou deux octets.
Donc, si vous mettez 'abc', alors ce sera 4 ou 5 octets utilisés pour cette colonne dans cette ligne.
Si vous avez utilisé char(15)
alors même 'abc' prendrait 15 octets, car les données sont complétées à droite pour utiliser les 15 octets.