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

Oracle Discussion :

[Null][Vide] VARCHAR2 Pareil ou pas ?


Sujet :

Oracle

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    377
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 377
    Points : 356
    Points
    356
    Par défaut [Null][Vide] VARCHAR2 Pareil ou pas ?
    Bonjour,

    Petite question :

    Si via un update je mets à jour un champ de type VARCHAR2 dans une table avec la chaine vide.
    Obtient on ou non null quand on fait un SELECT.
    Est-ce deux choses différentes ou non ?

    D'avance merci.

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 444
    Points
    3 444
    Par défaut
    Salut,

    Oui null et vide sont deux choses différentes, ça se test différement aussi :

    MONCHAMP = ""

    et

    MONCHAMP IS NULL

  3. #3
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Faux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    SQL> create table TEST (CHAMP VARCHAR2(10));
     
    Table crÚÚe.
     
    SQL> INSERT INTO TEST VALUES('');
     
    1 ligne crÚÚe.
     
    SQL> select count(*) from TEST;
     
      COUNT(*)
    ----------
             1
     
    SQL> select count(*) from TEST where CHAMP IS NULL;
     
      COUNT(*)
    ----------
             1
     
    SQL> select count(*) from TEST where CHAMP='';
     
      COUNT(*)
    ----------
             0
     
    SQL> TRUNCATE TABLE TEST;
     
    Table tronquÚe.
     
    SQL> INSERT INTO TEST VALUES(null);
     
    1 ligne crÚÚe.
     
    SQL> select count(*) from TEST;
     
      COUNT(*)
    ----------
             1
     
    SQL> select count(*) from TEST where CHAMP IS NULL;
     
      COUNT(*)
    ----------
             1
     
    SQL> select count(*) from TEST where CHAMP='';
     
      COUNT(*)
    ----------
             0
    '' et null sont la même chose et test = '' ne renvoit jamais rien !!

  4. #4
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 224
    Points : 19 567
    Points
    19 567
    Billets dans le blog
    25
    Par défaut
    Oui, mais c'est une spécificité bien Oracle !

  5. #5
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    ouh le vilain trolleur !!

  6. #6
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 444
    Points
    3 444
    Par défaut
    Bien vu, sous Oracle, il est vrai que l'insertion d'une chaine vide ('') insère null..
    Je trouve ça dommage d'ailleurs !
    Car théoriquement, j'ai toujours appris qu'une chaine vide est différent d'une chaine nulle ( non renseignée ). Mais pour Mr Oracle c'est pas le cas ^^

  7. #7
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Ben ouaih, ça fait environ 1 mois qu'on en discute régulièrement sur le forum mais bon... la question c'est Oracle doit-il s'aligner sur les autres (et au revoir la compatibilité ascendante) ou rester tel qu'il est (et dans ce cas au secours les applications multi-SGDB) ?

  8. #8
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 444
    Points
    3 444
    Par défaut
    Citation Envoyé par nuke_y
    Ben ouaih, ça fait environ 1 mois qu'on en discute régulièrement sur le forum mais bon... la question c'est Oracle doit-il s'aligner sur les autres (et au revoir la compatibilité ascendante) ou rester tel qu'il est (et dans ce cas au secours les applications multi-SGDB) ?
    Je pense qu'il faut qu'ils rejoignent la tendance générale, et qu'ils ne fassent pas bande à part avec une spécificité qui je trouve n'apporte rien, au contraire on perd une fonctionnalité.

    Je trouve ça illogique, car quand tu mets 0 dans un INTEGER par exemple, tu le fais car tu le souhaites, Oracle ne va pas s'amuser dans ce cas là à mettre un NULL à la place, et bien je trouve que c'est pareil pour le VARCHAR2.. Aucune raison de changer le '' en NULL !

  9. #9
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Je trouve ça illogique, car quand tu mets 0 dans un INTEGER par exemple, tu le fais car tu le souhaites, Oracle ne va pas s'amuser dans ce cas là à mettre un NULL à la place, et bien je trouve que c'est pareil pour le VARCHAR2.. Aucune raison de changer le '' en NULL !
    Même si Oracle n'est pas dans la norme , O est un chiffre au même rang que les 9 autres ....

  10. #10
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Mettre 0 dans un integer est positioner une valeur comme une autre.
    Mettre rien dans une chaîne est mettre .... rien !

    Pourquoi cela vous pose t-il un problème ?

  11. #11
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Disons que côté données '' et null c'est la même chose (de même que 0 et null pour un nombre, on pourrait penser que null+1 devrait donner 1), mais côté applicatif non. Or une base de données n'existe-t-elle pas uniquement pour stocker et restituer des données venues d'applications ?

    Voila pourquoi Oracle devra (je pense) changer sa façon de fonctionner... SAUF si Oracle décide qu'ils fournissent tous les outils et qu'il ne faut travailler qu'en FULL Oracle (ce qui serait stupide).

    A voir donc...

  12. #12
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    La question de la chaîne vide ou nulle est une spécificité car elle n'existe pour aucun autre type !

    cela n'est pas reproduisible avec un NUMBER ou un DATE.

    comment mettez vous "Vide" dans une number ou une date ?

    Pourquoi tenez-vous tant à cette spécificité ?

  13. #13
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Encore une fois , le chiffre 0 ey NULL c'est pas du tout pareil

    Nuke Pourquoi le fait de vouloir que les clients utilisent tout tes outils est stupide , ne serait pas plutôt commercial

  14. #14
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    On en a déjà discuté :

    1) même comportement que les autres SGDB

    2) comportement SGDB plus compatible avec le comportement applicatif général (ex : en java un String peut être null ou à '').

  15. #15
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Citation Envoyé par nuke_y
    Disons que côté données '' et null c'est la même chose (de même que 0 et null pour un nombre, on pourrait penser que null+1 devrait donner 1), mais côté applicatif non. Or une base de données n'existe-t-elle pas uniquement pour stocker et restituer des données venues d'applications ?

    Voila pourquoi Oracle devra (je pense) changer sa façon de fonctionner... SAUF si Oracle décide qu'ils fournissent tous les outils et qu'il ne faut travailler qu'en FULL Oracle (ce qui serait stupide).

    A voir donc...
    Non, non et re-non !!!

    0 et rien est absolument différent !
    0 correspond à la valeur 0
    rien correspond à aucune valeur connue (donc -> NULL)

  16. #16
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Une chaîne qui est vide est un chaîne qui n'a aucune valeur connue. je trouve donc cela supra-normal qu'elle soit donc équivalente à NULL.

  17. #17
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Mouaih c'est vrai, mon exemple avec 0 est capillotracté et... faux (surtout si on se réfère aux autres languages comme java dans lesquels un int est à 0 mais pas à null).

    Donc on oublie ça.

  18. #18
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 860
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 860
    Points : 3 444
    Points
    3 444
    Par défaut
    Mon exemple n'était pas prit au hasard.
    C'est une question récurentes, le 0 en mathématiques est une convention, mais au fond, est-ce que le 0 "existe" vraiment ?
    Un champ Integer à 0, ne devrait-il alors pas logiquement être NULL au même titre qu'une chaine vide le deviendrait ?

    Prenons un exemple pratique de la problématique : le 0 est une convention très pratique, car on s'en sert dans les calculs. La chaine vide aussi ! Une concaténation par exemple, est définie pour une chaine vide, mais l'est-elle pour une chaine "NULL" ?

    En Java, quand on instancie un objet de la classe String, on crée une chaine vide, on a bien un objet dans les mains. L'équivalent du null, en Java, est tout simplement ne pas instancier l'objet..

    Tout ça me rempli d'une tristesse infinie

    Je retourne à mon code

  19. #19
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Citation Envoyé par SheikYerbouti
    comment mettez vous "Vide" dans une number ou une date ?
    Sheik , ici tu parles d'une chaine vide du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into matable values ('') ;

  20. #20
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Bonjour,
    Bon premièrement OK pour le zéro qui est une valeur comme les autres, il n'a pas à revenir là dessus... en math, physique quantique ou tout ce que vous voulez, zéro c'est très différent que rien !

    Mais pour la chaîne de Varchar2, il est LOGIQUE que '' soit égal à null !
    Nous savons tous que pour insérer un varchar2 dans la base (et pour le récupérer d'ailleurs) il faut l'entourer d'apostrophes.
    Question :
    Ces apostrophes font-ils partie de la chaine en question ? => NON

    si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into maTable ('YORGLAA') ;
    Commit ;
     
    Select * from maTable ;
    j'obtiendrais YORGLAA => sans les apostrophes qui ne sont que des délimiteurs...

    donc si entre ces DELIMITEURS on ne met RIEN... ben il n'y a rien, donc NULL !

    CQFD !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. fonction vide: compilateur optimise ou pas
    Par kacedda dans le forum C++
    Réponses: 14
    Dernier message: 21/01/2008, 16h15
  2. Réponses: 2
    Dernier message: 21/12/2007, 16h05
  3. [AJAX] Résultat de requête Ajax vide sous IE, mais pas sous FF
    Par brazilia28 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/09/2007, 16h18
  4. Pointeur null, mais je ne comprends pas
    Par amine_en_france dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 11/07/2007, 14h14
  5. erreur de valaur nulle..qui ne l'est pas :-(
    Par bachilbouzouk dans le forum ASP
    Réponses: 7
    Dernier message: 20/04/2005, 08h52

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