SQL: chaîne vide vs valeur NULL

72

Je sais que ce sujet est un peu controversé et que de nombreux articles / opinions circulent sur Internet. Malheureusement, la plupart d'entre eux supposent que la personne ne sait pas quelle est la différence entre NULL et une chaîne vide. Donc, ils racontent des histoires sur des résultats surprenants avec des jointures / agrégats et font généralement des leçons SQL un peu plus avancées. En faisant cela, ils manquent absolument tout et sont donc inutiles pour moi. J'espère donc que cette question et toutes les réponses avancent un peu.

Supposons que j'ai une table avec des informations personnelles (nom, naissance, etc.) où l'une des colonnes est une adresse email de type varchar. Nous supposons que pour une raison quelconque, certaines personnes pourraient ne pas vouloir fournir une adresse électronique. Lorsque vous insérez ces données (sans courrier électronique) dans la table, vous avez le choix entre deux options: définissez la cellule sur NULL ou définissez-la sur une chaîne vide (''). Supposons que je connaisse toutes les implications techniques du choix d’une solution sur une autre et que je puisse créer des requêtes SQL correctes pour l’un ou l’autre des scénarios. Le problème est que même lorsque les deux valeurs diffèrent sur le plan technique, elles sont exactement les mêmes sur le plan logique. Après avoir regardé NULL et '' je suis arrivé à une conclusion: je ne connais pas l'adresse électronique du gars. Aussi peu importe combien j'ai essayé, Je ne pouvais pas envoyer de courrier électronique en utilisant la chaîne NULL ou une chaîne vide. La plupart des serveurs SMTP étaient apparemment en accord avec ma logique. J'ai donc tendance à utiliser NULL où je ne connais pas la valeur et considère la chaîne vide comme une mauvaise chose.

Après des discussions intenses avec des collègues, je suis venu avec deux questions:

  1. Ai-je raison de supposer que l'utilisation d'une chaîne vide pour une valeur inconnue provoque le "mensonge" d'une base de données sur les faits? Pour être plus précis: en utilisant l'idée de SQL sur ce qui est valeur et ce qui ne l'est pas, je pourrais arriver à la conclusion suivante: nous avons une adresse électronique, simplement en découvrant qu'elle n'est pas nulle. Mais plus tard, lorsque j'essayerai d'envoyer un courrier électronique, je parviendrai à une conclusion contradictoire: non, nous n'avons pas d'adresse de courrier électronique, cette @! # $ Base de données a dû mentir!

  2. Existe-t-il un scénario logique dans lequel une chaîne vide '' pourrait être un si bon porteur d'informations importantes (sans valeur ni valeur), qu'il serait gênant / inefficace de stocker par tout autre moyen (comme une colonne supplémentaire). J'ai vu de nombreux articles affirmant qu'il est parfois utile d'utiliser des chaînes vides avec des valeurs réelles et des valeurs NULL, mais jusqu'à présent, je n'ai pas vu de scénario qui serait logique (en termes de conception SQL / DB).

PS Certaines personnes seront tentées de répondre que c'est simplement une question de goût personnel. Je ne suis pas d'accord Pour moi, c'est une décision de conception avec des conséquences importantes. Je voudrais donc voir des réponses où l'opinion à ce sujet est soutenue par des raisons logiques et / ou techniques.

Jacek Prucia
la source
11
Savez-vous que dans Oracle, la chaîne vide est NULL?
user281377
8
@ammoQ: le traitement par Oracle des chaînes de longueur nulle n'est pas standard. D'ailleurs, ''même dans Oracle, ce n'est pas la même chose que NULL. Par exemple, l’affectation d’une CHAR(1)colonne à la valeur (c’est- ''à ' '-dire un espace), pas NULL. En outre, si Jacek utilisait Oracle, cette question ne serait probablement pas posée :-)
Dean Harding
2
Dean: Vous avez raison à propos de l'exemple char (1), mais il s'agit encore d'un autre fichier WTF, car il est '' IS NULLévalué trueen PL / SQL.
user281377
"ai-je raison de supposer que l'utilisation d'une chaîne vide pour une valeur inconnue provoque le" mensonge "d'une base de données sur les faits?" si vos utilisateurs professionnels ne se soucient pas de l'inconnu ou du vide, le mensonge est-il important?
Andy
Si vous devez utiliser la chaîne, merci de vous assurer qu'elle est vide. Dans l'intérêt de tous les développeurs, ne laissez pas une chaîne contenant un espace représenter votre valeur inconnue. Je t'en supplie.
Airn5475

Réponses:

83

Je dirais que NULLc'est le bon choix pour "pas d'adresse email". Il existe de nombreuses adresses e-mail "non valides" et "" (chaîne vide) n'en est qu'une. Par exemple, "foo" n'est pas une adresse électronique valide, "a @ b @ c" n'est pas valide, etc. Donc, juste parce que "" n’est pas une adresse email valide, il n’ya aucune raison de l’utiliser comme valeur "pas d’adresse email".

Je pense que vous avez raison de dire que "" n’est pas la bonne façon de dire "je n’ai pas de valeur pour cette colonne". "" est une valeur.

Un exemple où "" pourrait être une valeur valide, séparée de NULLpourrait être le deuxième prénom d'une personne. Tous n’ont pas un deuxième prénom, vous devez donc différencier "sans prénom" ("" - chaîne vide) de "je ne sais pas si cette personne a un deuxième prénom ou non" ( NULL). Il existe probablement de nombreux autres exemples dans lesquels une chaîne vide est toujours une valeur valide pour une colonne.

Dean Harding
la source
5
Entièrement d'accord. NULL est là pour une raison. CHOISISSEZ LE COMPTE (*) DE VOTRE TABLE où OMAIL EST [NOT] NULL est le moyen de le faire, pas la comparaison de chaînes qui aura tendance à être plus lente (même pour les chaînes vides je suppose mais je ne suis pas sûr de celui-ci :).
LudoMC
5
Je pense que NULLcela ne signifie pas qu’il n’ya pas d’adresse électronique, je pense que cela signifie que l’adresse électronique est actuellement inconnue, inconnue ou impossible à remplir pour d’autres raisons. Heureusement, il n’ya probablement pas de situation où l’on voudrait conserver dans une base de données les informations sur les personnes qui n’ont vraiment pas et ne prévoient pas d’adresse électronique, sinon un champ booléen séparé serait probablement nécessaire.
Alexey
9
@Alexey - NULL signifie qu'il n'y a pas de valeur. Comme d'autres l'ont souligné, une chaîne vide est une valeur.
Ramhound
3
@Ramhound, je conviens que la chaîne vide est une valeur et que NULL signifie vaguement "il n'y a pas de valeur". Je viens d'expliquer mon interprétation de "pas de valeur". À mon avis, ce n'est pas la même chose que "la personne n'a ouvert aucun compte de messagerie". C'est plutôt "pas d'adresse email enregistrée pour cette personne".
Alexey
5
@Ramhound NULL signifie qu'il n'y a pas de valeur. Une personne sans deuxième prénom n'y a aucune valeur. Par conséquent, NULL devrait également être utilisé dans une colonne initiale du milieu ... Ce qui est complètement opposé à l'argument présenté dans cette réponse.
Izkata
41

Tout en souscrivant aux commentaires ci-dessus, j’ajouterais cet argument comme principale motivation:

  1. Il est évident pour tout programmeur examinant une base de données qu'un champ marqué NULL est un champ facultatif. (c.-à-d. l'enregistrement ne nécessite pas de données pour cette colonne)
  2. Si vous marquez un champ NOT NULL, tout programmeur devrait supposer intuitivement qu'il s'agit d'un champ obligatoire.
  3. Dans un champ qui autorise les valeurs NULL, les programmeurs doivent s'attendre à voir les valeurs NULL plutôt que des chaînes vides.

Par souci de codage intuitif auto-documenté, utilisez NULL au lieu de chaînes vides.

colinbashbash
la source
4
+1 C'est l'argument du "moindre étonnement" en ce qui concerne les développeurs contre les chaînes vides. Aucun développeur qui viendrait plus tard ne s'attendrait à ce que des chaînes vides soient utilisées pour représenter "aucune adresse électronique".
Thomas
6

Dans votre exemple, si la valeur provient directement du champ Web, j'utiliserais une chaîne vide. Si l'utilisateur peut choisir de ne pas fournir d'e-mail ou de le supprimer, alors NULL.

Voici un lien avec des points que vous pourriez considérer: https://stackoverflow.com/questions/405909/null-vs-empty-when-dealing-with-user-input/405945#405945

--- édité (En réponse au commentaire de Thomas) ---

Les bases de données ne vivent pas sans applications qui les utilisent. Définir NULL ou '' n'a pas de valeur, si l'application ne peut pas l'utiliser correctement.

Prenons un exemple où l'utilisateur remplit le formulaire LONG et appuie sur Entrée pour envoyer la demande persistante au serveur. Il pourrait être en train d'entrer son email. Très probablement, vous voulez stocker tout ce qu'il a dans le champ email, pour qu'il puisse le finir plus tard. Et s'il n'entrait qu'un seul personnage? Et s’il entrait dans un caractère et le supprimait ensuite? Lorsque le courrier électronique n'est pas requis, les utilisateurs souhaitent parfois le supprimer: le moyen le plus simple d'effacer le champ. De même, dans le cas où un courrier électronique n'est pas nécessaire, il convient de le valider avant de l'envoyer.

Autre exemple: l'utilisateur fournit un courrier électronique en tant que spamto @ [bigcompany] .com - dans ce cas, il n'est pas nécessaire d'envoyer un courrier électronique, même s'il est existant et valide (et peut même exister). L'envoi d'un tel message est peut-être bon marché, mais s'il y a 10 000 utilisateurs avec de tels courriers électroniques pour les abonnements quotidiens, cette validation peut vous faire gagner beaucoup de temps.

Konstantin Petrukhnov
la source
7
-1. Peu importe que la base de données conduise un site Web ou non. La conception de bases de données est un monde différent de celui de la conception Web. La base de données doit être conçue pour capturer des faits sur le domaine métier indépendamment de l'interface utilisée pour l'écrire. Selon votre logique, devriez-vous utiliser la valeur NULL si, comme par hasard, la première application est un exécutable? Que se passe-t-il si la première application est une application Web alors que la prochaine est une application mobile? Concevez la base de données pour capturer les faits en utilisant des règles de normalisation et concevez le site Web pour y écrire.
Thomas
Je suis heureux que vous ayez appris à écrire et à commenter sur ce site :) Je crois toujours que DB devrait supporter les applications qui l'utilisent. Vérifiez ma réponse modifiée.
Konstantin Petrukhnov
4
Les bases de données ne vivent pas sans applications qui les utilisent. D'après mon expérience, ce n'est tout simplement pas vrai et à courte vue. La base de données est presque toujours utilisée en dehors de l'application pour laquelle elle a été conçue. En général, les bases de données survivent plus longtemps que les applications pour lesquelles elles ont été créées. Les bases de données doivent être conçues pour collecter des faits sur l'entreprise et l'interface utilisateur doit être conçue pour lire et écrire dans la base de données et non l'inverse. Le design relationnel est un état d'esprit totalement différent du design d'application.
Thomas
2
Exemples dans lesquels la base de données n'est pas utilisée uniquement par l' application d' origine : rapports, intégrations avec d'autres systèmes.
Thomas
1
Comme Thomas l'a indiqué, les bases de données peuvent et sont souvent utilisées par plusieurs applications, ce qui ajoute du poids à l'idée de garder vos données de base de données propres. Si vous ne voulez pas / ne pouvez pas gérer les NULL dans votre application, vous pouvez simplement les remplacer par vos "valeurs magiques" (belle description, Thomas) au niveau de votre couche d'accès aux données. Ainsi, les applications futures qui souhaitent accéder à la base de données n'ont pas besoin de connaître / de se conformer aux valeurs magiques des applications d'origine.
Bendemes
5

Je pense que Dean Hardings répond vraiment bien à cela. Cela dit, j'aimerais mentionner que lorsque vous parlez de valeurs NULL par rapport à des chaînes vides au niveau de la base de données, vous devez réfléchir à vos autres types de données. Voulez-vous stocker date min quand aucune date n'est fournie? ou -1 quand aucun int n'est fourni? Le fait de stocker une valeur sans valeur signifie que vous devez alors suivre toute une gamme de non-valeurs. Au moins un pour chaque type de données (éventuellement plus si vous obtenez des cas où -1 est une valeur réelle, vous devez donc avoir une alternative, etc.). Si vous avez besoin de faire quelque chose de "flou" au niveau de l’application, c’est une chose, mais il n’est pas nécessaire de polluer vos données.

bendemes
la source
2
+1 - C'est ce que j'appelle la "solution de valeur magique". Nous devons trouver une valeur magique pour chaque type de données afin de représenter une absence de valeur. De plus, dans certaines colonnes, la valeur magique commune est ou devient une valeur légitime. Une nouvelle valeur magique est donc nécessaire.
Thomas
5

Malheureusement, Oracle a confondu la représentation de la chaîne VARCHAR de longueur zéro avec la représentation de NULL. Ils sont tous deux représentés en interne par un seul octet de valeur zéro. Cela rend la discussion encore plus difficile.

Une grande partie de la confusion entourant NULL est centrée sur une logique à trois valeurs . Considérons le pseudocode suivant:

if ZIPCODE = NULL
    print "ZIPCODE is NULL"
else if ZIPCODE <> NULL
    print "ZIPCODE is not NULL"
else print "Something unknown has happened"

Vous ne vous attendriez pas au troisième message, mais c'est ce que vous obtiendriez sous une logique à trois valeurs. La logique à trois valeurs conduit les gens vers de nombreux bugs.

Une autre source de confusion est de tirer des conclusions de l’absence de données, comme de tirer des conclusions du chien qui n’a pas aboyé la nuit. Souvent, ces déductions n'étaient pas ce que l'auteur du NULL avait l'intention de cnvey.

Cela dit, il existe de nombreuses situations dans lesquelles NULL gère parfaitement l’absence de données et produit exactement le résultat souhaité. Un exemple est les clés étrangères dans les relations facultatives. Si vous utilisez une valeur NULL pour n'indiquer aucune relation dans une ligne donnée, cette ligne sera supprimée d'une jointure interne, comme vous le souhaitiez.

Sachez également que même si vous évitez complètement NULLS dans les données stockées (sixième forme normale), si vous effectuez des jointures externes, vous devrez tout de même vous en servir.

Walter Mitty
la source
4

Utilisez Null.

Il ne sert à rien de stocker une valeur de '', il vous suffira de rendre le champ de la table nullable. Cela rend les requêtes plus évidentes aussi.

Quelle requête SQL est plus évidente et lisible si vous voulez trouver des utilisateurs avec une adresse email?

  1. SELECT * FROM Users WHERE email_address != ''

  2. SELECT * FROM Users WHERE email_address IS NOT NULL

  3. SELECT * FROM Users WHERE email_address != '' and email_address IS NOT NULL

Je dirais que 2 est. Bien que 3 soit plus robuste dans les cas où de mauvaises données sont stockées.

Pour le cas de l'adresse e-mail sur le formulaire, qui est facultative, elle devrait également être reflétée dans le tableau. En SQL, il s'agit d'un champ nullable, ce qui signifie qu'il n'est pas connu.

Je ne vois aucune valeur commerciale raisonnable pour stocker une chaîne vide dans une table autre que simplement un mauvais design. C'est comme si vous stockiez une valeur de chaîne 'NULL' ou 'BLANK', et que les développeurs supposent qu'elle est nulle ou vide. Pour moi, c'est un mauvais design. Pourquoi stocker ça quand il y a NULL ??

Utilisez simplement NULL, et vous rendrez un peu plus heureux tout le monde.

PLUS D'INFORMATIONS:

SQL utilise un système logique à trois valeurs: True, False et Unknown.

Pour une explication meilleure et plus détaillée, je recommande aux développeurs de lire: Requêtes SQL - au-delà de VRAI et FAUX .

éponge
la source
3

pour la question technique spécifique, le problème n'est pas null vs chaîne vide, c'est un échec de validation . Une chaîne vide n'est pas une adresse email valide!

pour la question philosophique, la réponse est similaire: validez vos entrées. Si une chaîne vide est une valeur valide pour le champ en question, attendez-la et codez-la; sinon, utilisez null.

Une chaîne vide serait une entrée valide pour répondre à la question: Qu'est-ce que le mime a dit à la girafe?

Steven A. Lowe
la source
Même avec les meilleures intentions du monde, la validation ne résoudra peut-être pas ce problème - il devra peut-être quand même utiliser une méthode traitant des lignes où toutes les colonnes doivent être fournies avec une sorte de valeur. Dans ce cas, la question restera posée: quelle valeur utiliser lorsqu'il n'y a pas de valeur? Et la réponse sera bien sûr: la valeur qui n'indique aucune valeur. Dans les bases de données, cette valeur est généralement NULL.
Jmoreno
2

Je pourrais penser à une raison pour avoir NULL et la chaîne vide:

  • Vous avez des adresses email valides: [email protected]
  • Vous n'en avez pas (et devriez probablement en demander un): NULL
  • Vous savez que cette personne n'a pas d'adresse email: Empty String.

Cependant, je ne le recommanderais pas et utiliserais un champ séparé pour demander si vous savez s'il n'en existe aucun.

Marcel
la source
1

Si je comprends bien, la question est de savoir quelles interprétations de NULL et de chaîne vide doivent être choisies. Cela dépend du nombre d' états dans lesquels le champ particulier peut être situé.

L'interprétation dépend de la manière dont la base de données est utilisée. S'il existe une couche dans le code qui extrait complètement la base de données, le choix d'une stratégie (y compris deux règles) qui fonctionne est tout à fait acceptable. (Il est toutefois important de documenter la politique.) Cependant, si la base de données est utilisée à plusieurs endroits, vous devez utiliser un schéma très simple, car le code sera plus difficile à gérer et peut être erroné dans ce cas.

apoorv020
la source
1

Fondamentalement, sur le plan logique, il n'y a pas de différence entre la valeur "invalide" et "aucune entrée d'utilisateur", il s'agit simplement de "cas particuliers" la plupart du temps. Cas d'erreur.

Avoir la valeur null prend un espace supplémentaire: ceil (columns_with_null / 8) en octets / par ligne.

Cellule vide et null sont les deux moyens de marquer que quelque chose ne va pas / devrait être par défaut. Pourquoi auriez-vous besoin de 2 "mauvais" états? Pourquoi utiliser des valeurs NULL si elles occupent davantage d’espace et ont exactement la même signification que des chaînes vides? Cela introduira simplement de la confusion et de la redondance lorsque vous rencontrez deux choses qui signifient (cela pourrait signifier) ​​exactement la même chose, il est facile d’oublier que vous devez utiliser des valeurs NULL au lieu de chaînes vides (si, par exemple, un utilisateur a omis certains champs).

Et vos données peuvent devenir un gâchis. Dans un monde parfait, vous diriez "les données seront toujours correctes et je m'en souviendrai" ... mais quand les gens doivent travailler en équipe et que tout le monde n’est pas à votre niveau, il n’est pas rare de voir WHERE (aa. xx <> '' AND bb.zz N'EST PAS NUL)

Donc, au lieu de corriger les membres de mon équipe tous les deux jours, je m’applique simplement à la règle. Aucune valeur nulle, JAMAIS!

Compter les valeurs NON NULL est plus rapide ... une question simple est de savoir pourquoi vous auriez besoin de faire cela.

Slawek
la source
Je me souviens vaguement d'avoir lu quelque part que l'utilisation de NULL est en fait un coût (tant en termes de calcul que de stockage) pour la base de données. Donc, bon point en apportant cette formule.
Jacek Prucia
N'oubliez pas qu'une VARCHARcolonne prendra au moins 1 octet pour stocker la longueur de la chaîne, même si elle est nulle.
dan04
Cellule vide et null sont les deux moyens de marquer que quelque chose ne va pas . Pas vrai. Un null est un moyen d'indiquer une absence de valeur. Je parie que la plupart des SGBDR utilisent un tableau de bits sur chaque ligne pour indiquer quelles colonnes sont nulles. Ainsi, l'espace supplémentaire est si minime qu'il est inutile. L’optimisation prématurée n’a rien à redire aux inquiétudes liées au traitement supplémentaire; elles ne seront en rien comparées aux ralentissements créés pour permettre aux autres développeurs de "découvrir" que vous avez intentionnellement utilisé des chaînes vides.
Thomas
3
Aucune valeur nulle . C'est l'approche de l'autruche. "Nous allons nous mettre la tête dans le sable et déclarer que les valeurs absentes n'existent pas". Cela conduit généralement à la solution Valeur magique, dans laquelle vous devez définir une valeur magique pour chaque type de données afin de représenter l'absence de valeur.
Thomas
1

J'ai tendance à le voir non pas du point de vue de la base de données, mais du point de vue du programme. Je sais que cette question concerne le clic SQL, mais combien d'utilisateurs ont directement accès aux données?

Dans un programme, je n'aime pas null / rien. Il y a quelques exceptions, mais ce n'est que cela. Et ces exceptions ne sont que de mauvaises implémentations.

Donc, si l'utilisateur n'a pas mis le courrier électronique, il devrait y avoir quelque chose qui détermine si cela est valide ou non. Si un e-mail vierge convient, une chaîne vide apparaît. Si l'utilisateur n'a pas mis de courrier électronique et que cela enfreint une règle, l'objet doit l'indiquer.

L'idée de donner un sens à zéro est vieille école et est quelque chose que les programmeurs modernes doivent contourner.

Même dans une conception de base de données, pourquoi le champ de courrier électronique ne permet-il pas d'autoriser les valeurs NULL, d'avoir une chaîne de longueur nulle et d'avoir un autre champ indiquant si l'utilisateur a saisi quelque chose? Est-ce un peu cela demander à un SGBD? À mon avis, la base de données ne devrait gérer ni la logique d’entreprise ni la logique d’affichage. Il n'a pas été construit pour cela et fait donc très mal son travail.

ElGringoGrande
la source
pourquoi le champ email ne permet-il pas d'autoriser les valeurs NULL et d'avoir une chaîne de longueur zéro ? En d'autres termes, tout développeur connaissant les bases de données ne s'attendrait jamais à ce que les chaînes vides aient une signification magique. Vous essayez de créer votre propre valeur magique pour représenter ce qui existe fondamentalement dans chaque base de données: un concept pour représenter une absence de valeur. Pourquoi réinventer la roue? En outre, l'idée de NULLS est loin, loin, loin de la vieille école. Les null sont la clé de voûte de la conception de bases de données relationnelles.
Thomas
LOL. Comme je l'ai dit du point de vue des programmeurs, les valeurs nulles sont presque toujours pénibles et presque jamais nécessaires pour BUSINESS LOGIC. Personnellement, en tant que développeur, je me moque bien de la conception relationnelle. Si je le faisais, je serais un mec DB. Si je reçois un null d'une base de données, je le convertis presque toujours en quelque chose de rationnel, comme une chaîne vide, puis je laisse ma glorieuse conception de POO faire sa magie. Le cadre prend en charge ces idiots nuls de DBA imposer sur le monde. Je sais que les mecs de la DB doivent s’en occuper et je le ressens pour vous. Mais en tant que programmeur, je n'ai pas à le faire. J'ai de meilleures solutions.
ElGringoGrande
Vous n'avez "jamais" affaire à des nulls. Donc, ce que vous décrivez est une solution d’autruche associée à la solution de valeur magique. "J'ignorerai le fait que des valeurs absentes existent et je convertirai tous les entiers nuls en -1". Jusqu'au jour où -1 est une valeur réelle. Il convient de noter que l’une des raisons pour lesquelles MS a ajouté les génériques à .NET était pour remédier au déséquilibre massif entre impédance entre les bases de données et le code des applications et visait principalement l’expression de valeurs nulles dans le code de niveau intermédiaire. Ces "stupides nuls" existent également dans la logique métier.
Thomas
Le fait qu'un entier soit absent de la base de données (ou qu'il soit nul) ne signifie pas que je dois le représenter avec -1 ou evan un nullable (int). Si vous pensez que c'est la seule façon de traiter les valeurs nulles, vous ne comprenez pas très bien la programmation. Rappelez-vous que null n'est pas la même chose que rien. Comme vous l'avez dit, null représente un espace réservé pour les valeurs absentes dans une sorte de structure de données. Cela signifie quelque chose. La logique métier a rarement (ce qui n’est pas le même que jamais) besoin de ce concept car il s’agit d’une différence, et non de données. Et quand c'est nul, c'est rarement le meilleur moyen de le représenter.
ElGringoGrande
Même la logique métier doit tenir compte des valeurs absentes, ce qui est vrai dans presque tous les systèmes que j'ai vus ou construits au cours des 20 dernières années. La base de données modélise les faits commerciaux à saisir et à stocker. Si la logique métier veut pouvoir interagir avec la base de données, elle doit savoir comment gérer les valeurs NULL. Peu importe qu'il s'agisse d'une structure personnalisée, d'une valeur magique ou d'un générique. La logique applicative doit avoir la capacité de gérer la réception d'une valeur absente de la base de données et de marquer une valeur comme étant absente de la base de données.
Thomas
-1

Je ne pense pas que cela compte beaucoup, mais je l’aime mieux lorsque la valeur NULL est présente.

Lorsque je visualise les données affichées dans une table (comme dans SQL Server Management Studio), je peux mieux distinguer une valeur manquante si elle indique NULL et que l'arrière-plan est de couleur différente.

Si je vois un espace vide, je me demande toujours s'il est vraiment vide ou s'il y a des espaces blancs ou des personnages invisibles. Avec NULL, la garantie est vide à première vue.

entrez la description de l'image ici

Je ne distingue généralement pas les valeurs dans l'application, car il est inattendu et étrange que NULL et une chaîne vide signifient quelque chose de différent. Et la plupart du temps, je prends une approche défensive et ne fais que traiter avec les deux États. Mais pour moi en tant qu'être humain, NULL est plus facile à traiter lorsque vous examinez les données.

Tom Pažourek
la source
cela ne semble rien offrir de substantiel sur les points soulevés et expliqués dans les 12 réponses précédentes
gnat
@gnat: Je ne suis pas d'accord, personne dans les réponses n'a encore mentionné l'aspect de consultation des données par l'homme. Il n'y a qu'une seule valeur NULL, mais il peut y avoir beaucoup de valeurs qui ressemblent à une chaîne vide (pas seulement les espaces, mais aussi les caractères unicode bizarres). Je ne vois pas d'autre réponse mentionnant cet aspect de la question.
Tom Pažourek
pour autant que je peux dire que c'était assez bien aménagé en deuxième top réponse qui a été publié il y a 5 ans: « Il est évident pour tout programmeur regardant une base de données ... » etc
moucheron
@gnat: Je vois ce que vous voulez dire, même si je pense que l'auteur ne veut pas dire la même chose. Je crois qu'il en sait plus sur le fait que NULL implique des champs optionnels, mais une chaîne vide peut également être utilisée pour les champs obligatoires. NULL est donc plus logique pour les valeurs manquantes. Je suis d'accord avec lui. Mais ma réponse souligne le fait que la chaîne vide n'est pas aussi claire que la valeur NULL, car beaucoup de choses peuvent ressembler à des chaînes vides du premier coup sans être réellement des chaînes vides.
Tom Pažourek