J'ai lu quelques articles comme celui-ci sur une licence valeur de plaque de NULL (environ Droogie de < a href = "https://www.youtube.com/watch?v=TwRE2QK1Ibc" rel = "nofollow noreferrer"> DEF CON 27 ), y compris une partie du chapitre trois Little Data dans le livre Humble Pi < / a> par Matt Parker (en parlant de Steve Null), où le stockage d'une valeur de chaîne de" NULL "dans une base de données correspond à NULL < / strong> valeurs.

Avec les bases de données que j'ai utilisées (au moins AFAIK), "NULL" n'est pas la même chose qu'un NULL valeur. L'état d'un champ étant NULL est stocké séparément de la valeur.

Donc SQL comme

SELECT bar 
FROM foo
WHERE foobar IS NULL;

Serait différent de

SELECT bar 
FROM foo
WHERE foobar = 'NULL';

Quand j'ai entendu ces histoires pour la première fois, j'ai pensé qu'il s'agissait de légendes urbaines, mais après en avoir vu quelques-unes, je me suis demandé si je manquais quelque chose? S'agit-il de certaines bases de données qui ne distinguent pas "NULL" de is NULL (si oui, lesquelles, quelles sont celles actuelles)? Ou s'agit-il de la personne qui a construit l'application de base de données stockant "NULL" sous forme de chaîne pour les valeurs NULL ou une autre conception médiocre?

Lectures complémentaires:

Pour résumer ma question:

  • Certaines bases de données gèrent-elles NULL par rapport à "NULL"?
    • S'agit-il uniquement de bases de données historiques ou existe-t-il actuellement des bases de données qui font de même?
  • Y a-t-il une raison logique pour que "NULL" soit égal à IS NULL à partir de l'architecture POV?
  • Ou sont-ils tous un exemple d'échec de conception d'application?
    • Comment pouvez-vous tout gâcher?

J'aimerais vraiment voir un exemple de SQL qui confond NULL et 'NULL'.

2
Jim McKeeth 25 août 2020 à 20:34

2 réponses

Meilleure réponse

Vous décrivez deux concepts différents:

  • Dans les bases de données relationnelles, 'null' est une valeur CHAR (de longueur 4), aussi simple que cela.

  • De l'autre côté null n'est pas une valeur , mais représente une "valeur manquante". Ce n'est pas non plus l'absence de valeur; cela signifie que "la valeur existe, mais nous n'avons pas réussi à la récupérer".

Par conséquent, ce sont deux concepts très différents. Je ne connais pas de base de données qui gère mal les valeurs nulles lorsque vous la présentez. Cependant, je peux penser à des applications qui ne les distinguent pas bien. Je considérerais que des défauts sur l'application, pas sur les moteurs de base de données eux-mêmes.

Quoi qu'il en soit, voici quelques expressions SQL dans PostgreSQL et leurs valeurs pour illustrer les définitions ci-dessus:

select 
  'null' = 'null', -- 1. TRUE
  'null' = null,   -- 2. null (actually UNKNOWN)
  'null' <> null,  -- 3. null (actually UNKNOWN)
  'null' is null,     -- 4. FALSE
  'null' is not null, -- 5. TRUE
  null is null,       -- 6. TRUE
  null is not null,   -- 7. FALSE
  null = null,        -- 8. null (actually UNKNOWN)
  null <> null,       -- 9. null (actually UNKNOWN)
  null is not distinct from null, -- 10. TRUE
  (null = null) is unknown,       -- 11. TRUE
  (null = null) is true,          -- 12. FALSE
  (null = null) is false,         -- 13. FALSE
  (null <> null) is unknown       -- 14. TRUE

Voir l'exemple d'exécution sur DB Fiddle.

Remarque . Lorsque vous comparez généralement avec null, le résultat est la valeur réelle UNKNOWN, pas TRUE, pas FALSE. Cependant, la plupart des pilotes de base de données convertissent cette valeur en null lors de son envoi à votre application, comme vous pouvez le voir dans les cas n ° 2, n ° 3, n ° 8 et n ° 9 ci-dessus.

1
The Impaler 25 août 2020 à 19:01

C'est un défaut de conception. "NULL" est une chaîne et vous ne devriez pas avoir à utiliser une chaîne pour représenter Nothing. Donc, dans 1 cas, vous recherchez une valeur remplie exactement "NULL" où avec IS NULL il n'y a en fait rien.

1
Jimmy Smith 25 août 2020 à 17:37