Devrais-je utiliser NULL ou une chaîne vide pour ne représenter aucune donnée dans la colonne de la table?

StackOverflow https://stackoverflow.com/questions/167952

  •  03-07-2019
  •  | 
  •  

Question

Chaîne nulle ou vide - l'un est-il préférable que l'autre ne représente aucune donnée dans une colonne de table? (J'utilise spécifiquement MySQL, mais je pense que cela est indépendant du système.) Y a-t-il des avantages / inconvénients majeurs à utiliser l'un par rapport à l'autre, ou s'agit-il simplement d'une préférence du programmeur?

Était-ce utile?

La solution

Je suis fortement en désaccord avec tous ceux qui disent d’utiliser inconditionnellement NULL. Autoriser une colonne à être NULL introduit un état supplémentaire que vous n'auriez pas si vous définissiez la colonne comme NOT NULL. Ne faites pas cela si vous n'avez pas besoin de l'état supplémentaire. Autrement dit, si vous ne parvenez pas à faire une différence entre la signification de chaîne vide et la valeur de null, définissez la colonne sur NOT NULL et utilisez une chaîne vide pour représenter vide. Représenter la même chose de deux manières différentes est une mauvaise idée.

La plupart des personnes qui vous ont dit d'utiliser NULL ont également donné un exemple où NULL signifierait quelque chose de différent de la chaîne vide. Et dans ces exemples, ils ont raison.

Cependant, la plupart du temps, NULL est un état supplémentaire inutile qui oblige simplement les programmeurs à gérer davantage de cas. Comme d'autres l'ont mentionné, Oracle n'autorise pas cet état supplémentaire, car il traite NULL et chaîne vide comme la même chose (il est impossible de stocker une chaîne vide dans une colonne qui n'autorise pas la valeur null dans Oracle).

Autres conseils

Null. Une chaîne vide n'est pas "no data", ce sont des données qui se trouvent être vides.

Null is better " " représente en fait des données et il n'enregistrera pas la même chose dans votre code

Dans le contexte du modèle de base de données relationnelle, null indique "aucune valeur". ou "valeur inconnue". Il existe exactement dans le but que vous décrivez.

UPDATE: Désolé, j'ai oublié d'ajouter que, bien que la plupart (tous?) des RDMBS utilisent cette même définition pour null, il existe des différences nuancées dans la manière dont null est géré. Par exemple, MySQL et Oracle autorisent plusieurs valeurs null dans une colonne UNIQUE (ou un ensemble de colonnes), car null n'est pas une valeur et ne peut pas être considéré comme unique (null! = Null). Mais la dernière fois que j'ai utilisé MS SQL Server, cela ne permettait qu'un seul null. Vous devrez donc peut-être examiner le comportement du SGBDR et déterminer si la colonne en question sera contrainte ou indexée.

Ni l'un ni l'autre. Représente l'absence de données en tant qu'absence de tuples dans une relation.

Pour des raisons de performances, évitez les jointures dans certains SGBDR, mais essayez de concevoir le modèle de manière à ce que les informations manquantes se trouvent dans une relation distincte.

Voici quelques liens du site MySQL:

http://dev.mysql.com /doc/refman/5.0/fr/problems-with-null.html

http://dev.mysql.com /doc/refman/5.0/fr/working-with-null.html

J'ai lu une fois, qu'une valeur NULL est égale à 2 bits, tandis qu'une chaîne vide ne représente qu'un bit. 99% du temps, cela ne fera aucune différence, mais dans un très grand tableau quand ce n'est pas grave si NULL ou '' , alors cela pourrait être mieux d'utiliser '' si cela est vrai.

Toujours utiliser NULL. Considérez la différence entre " Je ne sais pas quel est le numéro de téléphone de cette personne " (NULL) et "Cette personne l'a laissée en blanc". (vide).

Utilisez le bon outil pour le travail. NULL peut indiquer qu'aucune valeur n'a encore été fournie ou qu'aucune valeur n'est applicable.

Mais une chaîne vide est aussi une information. Cela peut signifier qu'une valeur est applicable et qu'elle a été donnée, mais il se trouve qu'il s'agit d'une chaîne vide.

Le fait de permettre à une colonne de contenir les valeurs NULL et "" vous permet de faire la distinction entre ces cas. En tout cas, il n’est pas bon d’utiliser l’un pour signifier l’autre.

Sachez que lors de la concaténation de chaînes, tout ce qui est combiné à NULL donne NULL. Par exemple: CONCAT (NULL, 'foo') donne NULL. Apprenez à utiliser la fonction COALESCE () si vous souhaitez convertir NULL en une valeur par défaut dans une expression SQL.

La plupart du temps, null est mieux. Il y a probablement des situations où cela fait peu de différence, mais elles sont peu nombreuses. Rappelez-vous que lorsque vous interrogez que field = '' n'est pas identique au , le champ est null (au moins en MySQL).

Autant que je sache, Oracle ne fait pas la différence.

select 1 from (select '' as col  from dual) where col is null;

Considérez pourquoi il n'y a pas de données dans la colonne. Cela signifie-t-il que la conception de la table est bâclée? Même s’ils n’apprécient pas les valeurs nulles, il arrive qu’elles soient appropriées (ou suffisamment appropriées) et que le système ne meure généralement pas. N'autorisez jamais les valeurs nulles dans une clé candidate (clé primaire ou alternative).

Créez une table distincte pour la colonne nullable et une clé étrangère pour la table principale. Si un enregistrement ne contient pas de données pour cette colonne, il ne contiendra aucun enregistrement dans la deuxième table. C'est la solution la plus propre et vous n'avez pas à vous soucier de la gestion des valeurs nulles ni de la signification particulière des chaînes vides.

NULL est une non-valeur qui devrait être reléguée aux âges sombres d'où elle est née. J’ai constaté qu’une quantité non négligeable de programmation était nécessaire pour traiter les cas spéciaux NULL pouvant être facilement gérés avec une valeur par défaut.

Définissez comme valeur par défaut pour votre colonne une chaîne vide. Force la colonne à ne pas autoriser la valeur null, ce qui ne se produira probablement jamais une fois que vous aurez attribué une valeur par défaut. Ecrivez votre code en ignorant avec bonheur le cas où la valeur de la colonne est nulle.

Un problème important que j'ai toujours eu avec NULL est le suivant: "SELECT * de tbl WHERE column = NULL". retournera toujours un jeu de résultats vide. NULL ne peut jamais être égal à quoi que ce soit, y compris NULL. La colonne "mot clé Speical" a la valeur null " est le seul moyen de vérifier si quelque chose est nul. Si vous vous éloignez de null, la comparaison réussira: " column = '' " 7 lignes ont été renvoyées.

J'ai réalisé deux implémentations majeures de la base de données à partir de zéro et, à la fin, j'ai regretté l'utilisation de NULL. La prochaine fois, pas de NULL pour moi!

Il existe une exception importante. Bill Karwin a déclaré: "CONCAT (NULL," foo ") donne NULL". ce qui est vrai pour la plupart des SGBDR, mais PAS pour Oracle.

Comme suggéré par James Curran ci-dessus, Oracle a choisi cette conjoncture assez critique pour s’écarter du code SQL standard en traitant les valeurs NULL et les chaînes vides de la même manière. Pire que de les traiter de la même façon, cependant, il peut en réalité altérer le sens d’une valeur NULL en renvoyant un élément autre que NULL lors de la concaténation.

Concrètement, dans Oracle, CONCAT (NULL, 'foo') donne 'foo'. Merci Oracle, j'ai maintenant perdu mes valeurs NULL qui ne vous importent peut-être pas, mais qui font toute la différence lorsque les données sont transmises à d'autres SGBDR pour un traitement ultérieur.

A "pas de données" La valeur dans une colonne doit être représentée par une valeur par défaut. Rappelez-vous que NULL signifie une valeur inconnue, c'est-à-dire que la colonne peut avoir une valeur ou non, mais vous ne la connaissez pas pour l'instant.

Dans un système de demande de prêt, par exemple, une valeur NULL dans le champ Numéro du permis de conduire signifie que le demandeur ou le responsable du prêt n'a pas entré le numéro de permis de conduire. La valeur NULL ne signifie pas automatiquement que le demandeur ne possède pas de licence. Il peut ou non avoir une licence, vous ne le savez pas, c'est pourquoi c'est NULL.

L'ambiguïté réside dans les colonnes de chaînes. Une colonne numérique contient évidemment un zéro s'il n'y a pas de valeur. Comment pouvez-vous représenter une chaîne sans valeur? Dans l'exemple ci-dessus, pour les candidats sans permis de conduire, vous pouvez attribuer une valeur par défaut arbitraire, telle que "aucun". ou mieux encore une chaîne vide. Assurez-vous simplement que vous utilisez la valeur vide par défaut dans vos autres tables pour des raisons de cohérence.

Sur la question de ne pas utiliser les valeurs NULL en principe, il existe des cas où elles sont en réalité essentielles. En tant que personne travaillant beaucoup avec des statistiques, il est courant que les fournisseurs de données vous fournissent des ensembles de données contenant des données incomplètes. Par exemple, dans un ensemble de données de PIB par pays, vous pouvez trouver des chiffres de PIB manquants les années précédentes et suivantes. Une des raisons est qu'il n'y a pas de données officielles pour ces années du gouvernement du pays. Il sera incorrect de conclure que leur PIB est égal à zéro (DUH!) Et d'afficher une valeur nulle dans les données extraites ou un graphique. La valeur correcte est NULL, ce qui signifie que vous n'avez pas encore les données. L'utilisateur final interprète correctement les points de données manquants dans les données extraites et les graphiques comme étant PAS zéro. De plus, cela ne causera pas d'erreurs dans vos calculs, en particulier lorsque vous effectuez des moyennes.

Quelques "règles" cela aurait du sens en théorie serait en fait une solution mauvaise ou incorrecte dans votre cas.

Je trouve les valeurs NULL utiles pour l’intégrité référentielle. Dans le cas de MySQL, si un champ est défini sur NOT NULL, une insertion nécessite que les données soient définies; sinon, NULL est une valeur possible et la contrainte de clé étrangère n'est pas appliquée.

  1. id: clé primaire
  2. ID_produit: CLÉ ÉTRANGÈRE NON NUL
  3. ref_id: (NULLABLE)

id et zone product_id toujours obligatoires. ref_id peut être défini sur NULL. Toutefois, si une autre valeur est utilisée, elle doit satisfaire à la contrainte FOREIGN KEY.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top