IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

ID INT ou VARCHAR ?


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 87
    Points
    87
    Par défaut ID INT ou VARCHAR ?
    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

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    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...)

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 878
    Points : 53 055
    Points
    53 055
    Billets dans le blog
    6
    Par défaut
    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 +

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Rien à redire sur le sujet...
    Mais une petite remarque par rapport à un truc que j'ai lu récemment sur ce forum :
    Citation Envoyé par SQLpro Voir le message
    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)
    Citation Envoyé par L'illustre Waldar
    La longueur du char et du varchar existe et est stockée dans les deux types, sur deux octets.
    Mais votre char prendra toujours sa longueur maximale, dans votre exemple un char(2) fera toujours 4 octets là où un varchar(2) oscillera entre 3 et 4 octets.

    Si vous êtes sûr de votre donnée et que cette dernière fait toujours deux octets, les deux types fonctionneront de manière strictement identique.

    Et la petite citation de Tom Kytes (comparaison entre char(10) et varchar2(10), voir ici):
    If the field is in fact ALWAYS 10 bytes long, using a CHAR will not hurt -- HOWEVER, it will not help either.

    The only time I personally use a CHAR type is for CHAR(1). And that is only because its faster to type char(1) then varchar2(1) -- it offers no advantages
    Donc disons que c'est peut être idiot, mais pas sur tous les SGBD

    PS: Vive Oracle, Vive Tom Kyte !

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 878
    Points : 53 055
    Points
    53 055
    Billets dans le blog
    6
    Par défaut
    La longueur du char et du varchar existe et est stockée dans les deux types, sur deux octets.
    ça c'est valable sur les mauvais SGBDR (). 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 +

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    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)

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 878
    Points : 53 055
    Points
    53 055
    Billets dans le blog
    6
    Par défaut
    Peut être que MySQL se solidarise avec Oracle ???? Pour ne pas rester seul dans l'erreur ??? non ?

    A +

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    T'as vraiment une dent contre MySQL...

    In 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.
    http://dev.mysql.com/doc/refman/5.0/en/char.html

    ... mais cette fois, c'est raté !

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 878
    Points : 53 055
    Points
    53 055
    Billets dans le blog
    6
    Par défaut
    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 +

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    La longueur du char et du varchar existe et est stockée dans les deux types, sur deux octets.
    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.

Discussions similaires

  1. Question CONVERT INT en VARCHAR
    Par toxycyty dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/01/2012, 16h23
  2. CONVERT int vers varchar
    Par Wiwi31 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/02/2011, 09h45
  3. Performance Int Vs VARCHAR Grosse table
    Par w3blogfr dans le forum SQL
    Réponses: 16
    Dernier message: 26/01/2011, 11h06
  4. recherche int dans varchar
    Par lazzeroni dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/11/2006, 13h12
  5. Conversion VARCHAR vers INT
    Par Slash dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/05/2005, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo