Je m'intéresse principalement à MySQL et à PostgreSQL, mais vous pouvez répondre aux questions suivantes en général:
- Existe-t-il un scénario logique dans lequel il serait utile de distinguer une chaîne vide de NULL?
Quelles seraient les implications du stockage physique pour stocker une chaîne vide en tant que ...
- NUL?
- Chaîne vide?
- Un autre domaine?
- Une autre manière?
la source
NULL
ou nonJe ne connais pas MySQL ni PostgreSQL, mais laissez-moi traiter cela un peu en général.
Il existe un SGBD, à savoir Oracle, qui ne permet pas de choisir ses utilisateurs entre NULL et ''. Cela démontre clairement qu'il n'est pas nécessaire de faire la distinction entre les deux. Il y a des conséquences agaçantes:
Vous définissez un varchar2 sur une chaîne vide comme ceci:
ce qui suit conduit au même résultat
Mais pour sélectionner les colonnes où la valeur est vide ou NULL, vous devez utiliser
En utilisant
est syntaxiquement correct, mais il ne retourne jamais une ligne.
De l'autre côté, lors de la concaténation de chaînes dans Oracle. Les varchars NULL sont traités comme des chaînes vides.
donne abc . Les autres SGBD renverraient NULL dans ces cas.
Quand vous voulez exprimer explicitement qu'une valeur est assignée, vous devez utiliser quelque chose comme ''.
Et vous devez vous demander si le rognage n'est pas vide, cela donne NULL
Cela fait.
Regardons maintenant les SGBD où '' n'est pas identique à NULL (par exemple, SQL-Server)
Travailler avec '' est généralement plus facile et dans la plupart des cas, il n’est pas nécessaire de faire la distinction entre les deux. Une des exceptions que je connaisse est lorsque votre colonne représente un paramètre et que vous ne disposez pas de valeurs par défaut vides. Lorsque vous pouvez faire la distinction entre '' et NULL, vous pouvez indiquer que votre paramètre est vide et éviter que la valeur par défaut ne s'applique.
la source
Cela dépend du domaine sur lequel vous travaillez.
NULL
signifie absence de valeur (c'est-à-dire qu'il n'y a pas de valeur ), tandis que chaîne vide signifie qu'il existe une valeur de chaîne de longueur nulle.Par exemple, supposons que vous ayez une table pour stocker les données d'une personne et qu'elle contienne une
Gender
colonne. Vous pouvez enregistrer les valeurs en tant que "Homme" ou "Femme". Si l'utilisateur peut choisir de ne pas fournir les données de genre, vous devez l'enregistrer sousNULL
(c.-à-d. L'utilisateur n'a pas fourni la valeur) et non une chaîne vide (car il n'y a pas de genre avec la valeur '').la source
Une chose à garder à l'esprit est que lorsque vous avez un champ non requis, mais que toutes les valeurs présentes doivent être uniques, vous devrez stocker les valeurs vides sous la forme NULL. Sinon, vous ne pourrez avoir qu'un seul nuplet avec une valeur vide dans ce champ.
Il existe également des différences avec les valeurs algèbre relationnelle et NULL: NULL! = NULL, par exemple.
la source
UNIQUE
contrainte. Heureusement, à partir de 2008, vous pouvez utiliser un index filtré pour obtenir un comportement correct.Vous pouvez également prendre en compte la critique de NULL par Date et les problèmes de 3VL dans SQL et la théorie relationnelle (et la critique de Rubinson sur la critique de Date, Nulls, Logique à trois valeurs et Ambiguïté dans SQL: Critiquer la critique de Date ).
Les deux sont référencés et discutés en détail dans un thread SO associé, Options pour l'élimination des colonnes NULLable d'un modèle de base de données .
la source
Une nouvelle pensée, une grande influence sur votre choix de
NULL
/NOT NULL
est si vous utilisez un cadre. J'utilise beaucoup symfony et l'utilisation deNULL
champs permettant de simplifier une partie du code et la vérification des données lors de la manipulation des données.Si vous n'utilisez pas de framework ou si vous utilisez des instructions SQL simples et leur traitement, j'opterais pour le choix le plus simple à suivre. Je préfère généralement NULL pour que les
INSERT
déclarations ne soient pas fastidieuses en oubliant de définir les champs videsNULL
.la source
Ayant dû travailler avec Oracle ( ce qui ne vous permet pas de vous différencier ), je suis arrivé à la conclusion suivante:
D'un point de vue logique, cela n'a pas d'importance. Je ne peux vraiment pas penser à un exemple probant où la distinction entre NULL et chaîne zéro-longueur ajoute une valeur quelconque au SGBD.
A partir de ce qui suit: Vous avez soit une
NULL
colonne capable qui n'autorise pas zéro-len''
(solution Oracle-ish), soit uneNOT NULL
colonne qui autorise zéro-len.Et de par mon expérience,
''
cela a beaucoup plus de sens lors du traitement des données, car normalement vous voudriez traiter l'absence d'une chaîne en tant que chaîne vide: Concaténation, Comparaison, etc.Remarque: Pour revenir à mon expérience Oracle: Disons que vous souhaitez générer une requête pour une requête de recherche. Si vous utilisez,
''
vous pouvez simplement générerWHERE columnX = <searchvalue>
et cela fonctionnera pour les recherches d'égalité. Si vous utilisezNULL
vous devez faireWHERE columnX=<searchvalue> or (columnX is NULL and serchvalue is NULL)
. Bah! :-)la source
Ils sont également différents du point de vue du design:
par exemple
Ressemble à:
Permet d'insérer quelques données:
Essayons maintenant avec null:
Ceci est permis.
Soooooo: Les nulls ne sont pas des chaînes triviales ni l'inverse.
À votre santé
la source
Si nous parlons de théorie, les règles de Codd stipulent que le SGBDR doit traiter les
NULL
valeurs d’une manière particulière.Les architectes de base de données peuvent déterminer exactement comment utiliser cela, en fonction du domaine réel - domaine - tâche - projet - application -.
la source