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

MS SQL Server Discussion :

Comment choisir le type de champ ?


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 117
    Points : 92
    Points
    92
    Par défaut Comment choisir le type de champ ?
    Bonjour,

    Lors de la création d'une table, nous avons le choix entre plusieurs types de champs (varchar, nvarchar....).

    Cependant, je ne sais pas comment choisir le type de champs. Plus précisément, j'ai un doute sur le choix de nvarchar(MAX) sous Microsoft SQL Server 2005.

    Ce choix peut-il être trop gourmand au niveau de la mémoire?
    Si je choisis nvarchar(MAX), la table occupera-t-elle 2 GO(indique sur le site de Microsoft) de mémoire pour ces champs?

    À chaque enregistrement le nombre d'octets est-il variable pour un même champ?

    Merci d'avance

  2. #2
    Membre actif
    Avatar de SQL_EVAN
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2011
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 161
    Points : 245
    Points
    245
    Par défaut
    Bonjour,

    Le choix de type de données n'est prix qu'en prenant en compte le contexte de l'application ou besoin.

    En théorie par contre, un varchar(MAX) ne prend, sur le disque, que la taille de données insérées. Ceci dit, ce n'est pas conseillé sauf si vous pensez que votre application va réellement avoir besoin d'insérer 2Go de texte.

    Ce sera mieux de mettre une limite sur la taille quand-même. Souvent varchar(4000) peut suffire ou même varchar(50) pour des noms par exemple.

    C'est libre à vous de décider mais il faut trouver le juste milieu entre la liberté d'insérer d'énormes quantités de données et la volumétrie disponible (ainsi que les perfs avec les montées en charge).

    C'est plus clair pour vous maintenant?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 117
    Points : 92
    Points
    92
    Par défaut
    Merci beaucoup pour votre rapidité.

    Ça répond exactement à mes questions, sauf sur un point. Imaginons que je décide d'attribuer un nvarchar(MAX) et que j'ai un enregistrement de 2Go de texte et un deuxième enregistrement de 1Go de texte. Le deuxième occupera 1Go ou 2Go sur mon disque?

    Merci d'avance!

  4. #4
    Membre actif
    Avatar de SQL_EVAN
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2011
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 161
    Points : 245
    Points
    245
    Par défaut
    Pour être plus clair. Le préfixe "var" veut dire variable. C'est à dire si vous insérer 1Go d3 texte cela va occuper 1 giga sur le disque (plus les pointers/indexes etc s'ils existent).

  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 917
    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 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    La norme SQL propose 4 type de données pour les chaines :
    • CHAR(n) : taille fixe encodage ASCII => 1 caractère = 1 octet et complétion à blanc.
    • VARCHAR(n) : taille variable de maximum n encodage ASCII => 1 carcactère = 1 octet + 2 octets pour stockage de la taille de la donnée
    • NCHAR(n) : taille fixe encodage UNICODE=> 1 caractère = 2 octets et complétion à blanc.
    • NVARCHAR(n) : taille variable de maximum n encodage ASCII => 1 caractère = 2 octets + 2 octets pour stockage de la taille de la donnée

    Le [N]VARCHAR(max) est limité à 2 Go, soit 2 milliards de caractères ASCII si VARCHAR(max), sinon 1 milliard de caractères si UNICODE (NVARCHAR(max).

    Il faut toujours adapter la taille des colonnes à l'usage applicatif. De plus la plupart des données étant normalisées, vous trouverez des tailles définies dans les normes... Exemple : ligne d'adresse = 38 caractères au maximum => CP + Ville = 39 car, par exemple CP = 5 et Ville = 32 => 5 + 32 + 1 (blanc de séparation) = 38

    ATTENTION :
    le VARCHAR fragmente à l'UPDATE et est moins rapide en recherche.
    le [N]VARCHAR(max) n'est pas stocké dans la ligne, mais dans des pages de débordement. S'agissant d'un LOB, certaines opérations relationnelles sont impossible dessus (groupage, tri...)
    Utiliser du NCHAR/NVARCHAR lorsque cela n'est pas nécessaire (multilangue ou langage idéographique) double le volume des données et diminue singulièrement les performances (pensez donc au moins à doubler la capacité disque et RAM...)

    Lors de la modélisation de la base (MCD ou Modèle Conceptuel de Données) tout ceci doit être étudié au cas par cas pour chaque rubrique d'information ! Sans cela les performances peuvent être potentiellement catastrophiques....

    A +

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 117
    Points : 92
    Points
    92
    Par défaut
    Je remercie SQL_EVAN et SQL Pro, les definitions que vous m'avez données sont très intéressantes et importantes pour la conception de ma base de données.

    Reste une dernier question bête avant de cloturer cette discusion:

    NVARCHAR(n): à quoi correspond le "(n)"? Aux nombres de caractères ou au nombres d'octects?

    Si ça correspond aux nombres de caractères comment convertir en octets?

  7. #7
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par siva27 Voir le message
    Reste une dernier question bête avant de cloturer cette discusion:

    NVARCHAR(n): à quoi correspond le "(n)"? Aux nombres de caractères ou au nombres d'octects?

    Si ça correspond aux nombres de caractères comment convertir en octets?
    (n) correspond au nombre de caractères. Pour calculer, il faut compter 2 octets par caractère + 2
    Mais attention, nvarchar(250) != 250 * 2 + 2. Tout dépend du nombre de caractères réellement insérés.
    Par exemple un nvarchar(250) qui contiendrait 'truc', ça ferait 4*2+2 = 10 octets

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2013
    Messages : 117
    Points : 92
    Points
    92
    Par défaut
    Bonjour darkelend,

    Merci pour votre réponse, maintenant que j'ai appris les bases je pense qu'il est temps de mettre tous ca en pratique.

    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment tester le typed'un champ avant de le changer?
    Par korntex5 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/06/2007, 17h52
  2. Comment choisir un type d'attribut d'une classe?
    Par chevy dans le forum Langage
    Réponses: 8
    Dernier message: 18/05/2007, 17h08
  3. Comment choisir entre type et classe ?
    Par Invité dans le forum UML
    Réponses: 5
    Dernier message: 23/02/2007, 00h10
  4. Comment récuperer le type de champs ?
    Par lonycc dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/02/2007, 12h40
  5. [Excel] Comment tester le type de champ ?
    Par natie_49 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 17/06/2005, 15h17

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