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.
Version imprimable
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.
Salut,
Oui null et vide sont deux choses différentes, ça se test différement aussi :
MONCHAMP = ""
et
MONCHAMP IS NULL
Faux :
'' et null sont la même chose et test = '' ne renvoit jamais rien !!Code:
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
Oui, mais c'est une spécificité bien Oracle !
ouh le vilain trolleur !! :wink:
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 ^^
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é.Citation:
Envoyé par nuke_y
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 ! :evil:
8O Même si Oracle n'est pas dans la norme , O est un chiffre au même rang que les 9 autres ....Citation:
Envoyé par KiLVaiDeN
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 ?
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...
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é ?
Encore une fois , le chiffre 0 ey NULL c'est pas du tout pareil
Nuke :arrow: Pourquoi le fait de vouloir que les clients utilisent tout tes outils est stupide , ne serait pas plutôt commercial :wink:
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 à '').
Non, non et re-non !!!Citation:
Envoyé par nuke_y
0 et rien est absolument différent !
0 correspond à la valeur 0
rien correspond à aucune valeur connue (donc -> NULL)
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.
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. :wink:
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 :lol:
Je retourne à mon code :wink:
Sheik , ici tu parles d'une chaine vide du genre :Citation:
Envoyé par SheikYerbouti
Code:
1
2 insert into matable values ('') ;
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 faisj'obtiendrais YORGLAA => sans les apostrophes qui ne sont que des délimiteurs...Code:
1
2
3
4 insert into maTable ('YORGLAA') ; Commit ; Select * from maTable ;
donc si entre ces DELIMITEURS on ne met RIEN... ben il n'y a rien, donc NULL !
CQFD !