Question

Juste pour clarifier, en spécifiant quelque chose comme Varchar (45) signifie qu'il peut prendre des caractères maximaux? Je me souviens que j'ai entendu quelqu'un il y a quelques années que le nombre entre parenthèses ne fait pas référence au nombre de personnages, puis la personne a essayé de m'expliquer quelque chose d'assez compliqué que je ne comprends pas et que je ne comprends pas déjà.

Et quelle est la différence entre Char et Varchar? J'ai cherché un peu et j'ai vu que Char vous donne le maximum de la taille de la colonne et il est préférable de l'utiliser si vos données ont une taille fixe et utilisent Varchar si votre taille de données varie.

Mais si cela vous donne le maximum de la taille de la colonne de toutes les données de cette colonne, n'est-ce pas mieux de l'utiliser lorsque la taille de vos données varie? Surtout si vous ne savez pas quelle est la taille de vos données. Varchar doit spécifier la taille (Char n'a pas vraiment besoin de non?), N'est-ce pas plus gênant?

Était-ce utile?

La solution

Vous devez également spécifier la taille avec CHAR. Avec CHAR, Les valeurs de colonne sont rembourrées avec des espaces pour remplir la taille que vous avez spécifiée, alors que avec VARCHAR, seule la valeur réelle que vous avez spécifiée est stockée.

Par exemple:

CREATE TABLE test (
    char_value CHAR(10),
    varchar_value VARCHAR(10)
);

INSERT INTO test VALUES ('a', 'b');

SELECT * FROM test;

Ce qui précède sélectionnera "A" pour char_value et "b" pour varchar_value

Si toutes vos valeurs sont à peu près de la même taille, le CHAR est peut-être un meilleur choix car il nécessitera souvent moins d'espace de stockage que VARCHAR. Ceci est dû au fait VARCHAR stocke à la fois la longueur de la valeur et la valeur elle-même, alors que CHAR peut simplement stocker la valeur (de taille fixe).

Autres conseils

La Documentation MySQL Donne une bonne explication des exigences de stockage des différents types de données.

En particulier, pour une chaîne de longueur l, un CHAR(M) Le type de données prendra les octets (M XC) (où C est le nombre d'octets requis pour stocker un caractère ... Cela dépend du jeu de caractères utilisé). UN VARCHAR(M) prendra (l + 1) ou (l + 2) selon que m est <= 255 ou> 255.

Donc, cela dépend vraiment de la durée de vos chaînes, de la variation de longueur.

NB: La documentation ne discute pas de l'impact des ensembles de caractères sur les exigences de stockage d'un VARCHAR taper. J'ai essayé de le citer avec précision, mais je suppose que vous devez également multiplier la longueur de la chaîne par la largeur de l'octet de caractère pour obtenir l'exigence de stockage.

Char et Varchar devient en fait hors de propos si vous n'avez qu'un seul champ de longueur variable dans votre table, comme un varchar ou un texte. MySQL changera automatiquement tous les caractères en VARCHAR.

L'enregistrement de longueur / taille fixe peut vous donner des performances supplémentaires, mais vous ne pouvez pas utiliser de types de champs de longueur variable. La raison en est qu'il sera plus rapide et plus facile pour MySQL de trouver le prochain enregistrement.

Par exemple, si vous effectuez un SELECT * FROM TABLE LIMIT 10, MySQL doit scanner le fichier de table pour le dixième enregistrement. Cela signifie trouver la fin de chaque enregistrement jusqu'à ce que vous trouviez la fin du 10e record. Mais si votre table a des enregistrements de longueur / taille fixe, MySQL a juste besoin de connaître la taille des enregistrements, puis de sauter 10 x #bytes.

Si vous savez qu'une colonne contiendra un petit nombre fixe de caractères utilisez un char, sinon utilisez un varchar. Une colonne de char est rembourrée à la longueur maximale.

Varchar a une petite surcharge (4-8 octets en fonction des SGBDR), mais utilise uniquement la surcharge + le nombre réel de charrs stockés.

Pour les valeurs que vous savez qu'ils vont être constants, par exemple pour les numéros de téléphone, les codes postaux, etc., il est optimal d'utiliser "char" à coup sûr.

Les choses compliquées dont vous ne vous souvenez pas, c'est que les 45 se réfèrent aux octets, pas aux caractères. Ce n'est pas la même chose si vous utilisez un codage de caractères multi -yte. Dans Oracle, vous pouvez spécifier explicitement les octets ou les caractères.

varchar2(45 BYTE)

ou

varchar2(45 CHAR)

Voir Différence entre l'octet et le char dans les données de colonne

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top