Salut a tous,
Avec un membre de mon trinome nous avons un different sur le type d'un ID. En esperant avoir une reponse d'un expert (sinon il n'y croira pas ^^), est ce que le type est un INT ou un VARCHAR ?
Merci
Salut a tous,
Avec un membre de mon trinome nous avons un different sur le type d'un ID. En esperant avoir une reponse d'un expert (sinon il n'y croira pas ^^), est ce que le type est un INT ou un VARCHAR ?
Merci
ID désigne habituellement un identifiant de la ligne d'une table.
Ce n'est généralement pas une donnée que l'on montre à l'utilisateur final parce que c'est un code anonyme totalement inutile en tant que donnée à gérer. Par contre, c'est ce qui sert comme clé primaire des tables non associatives et comme clé étrangère dans les tables associées.
Pour des raisons de performance maintes fois expliquées sur ce forum, la clé primaire sera de type entier non signé non null et auto-incrémenté. Un recherche sur un entier est beaucoup plus rapide que sur un VARCHAR.
Et ceci reste valable même si une colonne de type VARCHAR est clé candidate pour une table.
Un exemple...
Soit une table abritant les données sur des employés d'une entreprise. Cette entreprise attribue à chaque employé un groupe de lettres de manière à l'identifier de manière unique. Ce code sert de login utilisateur sur le réseau de l'entreprise et d'abréviation pour l'expéditeur et/ou le destinataire dans les correspondances internes et externes.
Le code est constitué des initiales du nom de l'employé. Si ces initiales sont déjà prises par un autre employé, on ajoute la deuxième lettre du nom, ou la troisième... puis la deuxième du prénom, ou la troisième...
Jean Dupont ==> JD
Jeanne Durand ==> JDU
Jules Duparc ==> JDP
...
A première vue, le code de l'employé est une clé candidate sympathique.
Mais si on l'utilise comme clé primaire de la table des employés, ce code va servir de clé étrangère dans les autres tables (congés, salaires, absences...).
Si Jeanne Durand se marie et change de nom, l'entreprise a décidé de changer ses intiales. Il faudra alors changer également ce code dans toutes les tables ou celui-ci est clé étrangère !
Avec une clé primaire anonyme de type entier non signé non-null et auto-incrémenté, il suffit de changer le code dans la table des employés.
Les données sont plus robustes.
Employes (E_Id, E_Code, E_Nom, E_Prenom, E_Adresse, E_DateNaissance...)
A lire pour clore le débat :
COMMANDEMENT N°2
dans : http://blog.developpez.com/sqlpro/p6...-sur-ms-sql-s/
J'ai d'ailleurs rajouté un paragraphe spécialement pour traiter votre cas :
"
Assenons un dernier coup... Avec un CHAR de 4 identique en cout de stockage à un INTEGER (ne prenons pas un VARCHAR de 4 c'est idiot, il lui faut 6 octets au pire car il doit en sus stocker la longueur réelle de la donnée), combien de valeurs différentes de clefs puis-je stocker ? 4 x 8 = 32 => 2^32 - 1... Soit 4 294 967 295 ? Eh bien pas du tout... En effet la table des caractères compte déjà 32 caractères non imprimables (ceux de 0 à 1F en hexadécimal, comme par exemple la sonnette 7 !). Donc en théorie votre clavier vous permet donc (256 - 32) ^ 4 = 2 517 630 976 C'est déjà 2 fois moins de clefs possible. Mais allez-vous franchement demander à vos clients de saisir comme code : #"{,|@ùÈ ??? Donc si l'on enlève tous les caractères de ponctuation et les lettres accentuées, il vous reste exactement 62 caractères en comptant majuscule et minuscule. Et comme le risque est grand de se tromper dans la saisie d'un code comme dEfH0iI, vous en viendrez a ne plus devoir faire de différence entre majuscules et minuscules ce qui vous réduit les possibilités aux 26 lettres de l'alphabet et aux 10 chiffres soit 36 combinaisons, c'est à dire au plus 36 ^ 4 valeurs de clefs possible soit 1 679 616 combinaisons. Quelle excellent rendement que d'avoir perdu 99,92 % de clefs potentielles. Que dirait-on d'un moteur dont le rendement est de 0,01 % ?
"
A +
ça c'est valable sur les mauvais SGBDR (La longueur du char et du varchar existe et est stockée dans les deux types, sur deux octets.). Je peut te dire que ce n'est pas le cas sur la lignée Ingres donc :
1) INGRES
2) SYBASE
3) SQL SERVER
4) PostGreSQL
Je crois d'ailleurs que c'est aussi le cas d'InterbAse / Firebird
A +
Hmmm, ok.
Donc seul Oracle fait ça...
C'est vrai que c'est du gachis... une idée de la raison ? (choix d'implémentation, ou connerie historique)
Peut être que MySQL se solidarise avec Oracle ???? Pour ne pas rester seul dans l'erreur ??? non ?
A +
T'as vraiment une dent contre MySQL...
http://dev.mysql.com/doc/refman/5.0/en/char.htmlIn contrast to CHAR, VARCHAR values are stored as a one-byte or two-byte length prefix plus data. The length prefix indicates the number of bytes in the value. A column uses one length byte if values require no more than 255 bytes, two length bytes if values may require more than 255 bytes.
... mais cette fois, c'est raté !![]()
Mais cela dépend du moteur.. Donc il faudrait que tu me dise dans quel moteur tu a pêché cette info et si c'est pareil dans tous...
A +
En fait je n'ai pas été assez précis (je n'ai terminé le fil de la discution qu'hier) : un octet est utilisé pour stocker la longueur et un autre octet est utilité pour stocker si le champ est null.La longueur du char et du varchar existe et est stockée dans les deux types, sur deux octets.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager