Mysql
 sql >> Base de données >  >> RDS >> Mysql

Y a-t-il des inconvénients à utiliser un varchar(255) générique pour tous les champs textuels ?

En stockage, VARCHAR(255) est assez intelligent pour stocker uniquement la longueur dont vous avez besoin sur une ligne donnée, contrairement à CHAR(255) qui stockerait toujours 255 caractères.

Mais puisque vous avez marqué cette question avec MySQL, je mentionnerai une astuce spécifique à MySQL :lorsque les lignes sont copiées de la couche du moteur de stockage vers la couche SQL, VARCHAR les champs sont convertis en CHAR pour avoir l'avantage de travailler avec des lignes à largeur fixe. Ainsi, les chaînes en mémoire deviennent complétées à la longueur maximale de votre VARCHAR déclaré colonne.

Lorsque votre requête génère implicitement une table temporaire, par exemple lors d'un tri ou GROUP BY , cela peut utiliser beaucoup de mémoire. Si vous utilisez beaucoup de VARCHAR(255) des champs pour des données qui n'ont pas besoin d'être aussi longues, cela peut rendre la table temporaire très volumineuse.

Vous aimerez peut-être aussi savoir que ce comportement de "remplissage" signifie qu'une chaîne déclarée avec le jeu de caractères utf8 est remplie à trois octets par caractère, même pour les chaînes que vous stockez avec un contenu à un octet (par exemple, des caractères ascii ou latin1). De même, le jeu de caractères utf8mb4 entraîne le remplissage de la chaîne à quatre octets par caractère en mémoire.

Donc un VARCHAR(255) en utf8, stocker une chaîne courte comme "Pas d'opinion" prend 11 octets sur le disque (dix caractères de jeu de caractères inférieurs, plus un octet pour la longueur) mais cela prend 765 octets en mémoire, et donc dans les tables temporaires ou les résultats triés.

J'ai aidé des utilisateurs de MySQL qui, sans le savoir, créaient fréquemment des tables temporaires de 1,5 Go et remplissaient leur espace disque. Ils avaient beaucoup de VARCHAR(255) colonnes qui stockaient en pratique des chaînes très courtes.

Il est préférable de définir la colonne en fonction du type de données que vous avez l'intention de stocker. Il présente des avantages pour appliquer les contraintes liées aux applications, comme d'autres l'ont mentionné. Mais il a les avantages physiques d'éviter le gaspillage de mémoire que j'ai décrit ci-dessus.

Il est difficile de savoir quelle est l'adresse postale la plus longue, bien sûr, c'est pourquoi beaucoup de gens choisissent un long VARCHAR c'est certainement plus long que n'importe quelle adresse. Et 255 est usuel car c'est la longueur maximale d'un VARCHAR dont la longueur peut être codée sur un octet. C'était aussi le maximum VARCHAR longueur dans MySQL antérieur à 5.0.