Quelle est la valeur de NULL dans SQL Server?

Je sais que NULL n'est pas nul … ni c'est une string vide. Mais alors quelle est la valeur de NULL … que le système conserve, pour l'identifier?

Je crois que pour chaque colonne qui autorise les valeurs nulles, les lignes ont un bitmap nul. Si la ligne de la colonne spécifiée est null, le bit de la bitmap est 1, sinon il est égal à 0.

NULL est un élément spécial du langage SQL qui n'est égal ni égal à aucune valeur dans aucun type de données.

Comme vous l'avez dit, NULL n'est pas zéro, une string vide ou false . Ie false = NULL renvoie UNKNOWN .

Certaines personnes disent que NULL n'est pas une valeur, c'est un état . L'état d'avoir aucune valeur. Un peu comme un Zen Koan . 🙂

Je ne sais pas exactement comment MS SQL Server le stocke en interne, mais cela n'a pas d'importance, tant qu'ils l'implémentent selon le standard SQL.

Le format de ligne SQL Server est décrit dans MSDN et également analysé sur différents blogs, comme Anatomy of a Record de Paul Randal. L'information importante est la structure d'logging:

  • en-tête
    • 4 octets de long
    • deux octets de métadonnées d'logging (type d'logging)
    • deux octets pointant vers l'avant dans l'logging vers le bitmap NULL
  • partie de longueur fixe de l'logging, contenant les colonnes stockant des types de données qui ont des longueurs fixes (par exemple bigint, char (10), date / heure)
  • Bitmap NULL
    • deux octets pour le nombre de colonnes dans l'logging
    • nombre variable d'octets pour stocker un bit par colonne dans l'logging, que la colonne soit nullable ou non
    • cela permet une optimization lors de la lecture des colonnes qui sont NULL
  • tableau de décalage de colonne de longueur variable
    • deux octets pour le nombre de colonnes de longueur variable
    • deux octets par colonne de longueur variable, donnant le décalage à la fin de la valeur de la colonne
  • balise de version
    • une structure de 14 octets qui contient un horodatage plus un pointeur dans le magasin de versions dans tempdb

Les champs NULL ont donc un bit défini dans le bitmap NULL.

Je doute que les enquêteurs voulaient que vous sachiez exactement comment le server SQL stocke null , le but d'une telle question est de vous amener à réfléchir à la façon dont vous stockez des valeurs spéciales. Vous ne pouvez pas utiliser une valeur sentinelle (ou un nombre magique), car cela rendrait toutes les lignes contenant cette valeur soudainement null .

Il y a plusieurs façons d'y parvenir. Les 2 plus simples qui viennent à l'esprit sont d'avoir un drapeau stocké avec chaque valeur nullable qui est fondamentalement un indicateur isNull (c'est aussi fondamentalement comment Nullable<T> fonctionne dans .NET). Une seconde méthode consiste à stocker avec chaque ligne un bitmap de drapeaux nuls, un pour chaque colonne.

Face à de telles questions d'entrevue, la pire réponse absolue est de s'asseoir et de regarder fixement. Pensez-y un peu, admettez que vous ne savez pas comment SQL Server le fait, et ensuite présentez quelques manières raisonnables de le faire. Vous devriez aussi être prêt à parler un peu des raisons pour lesquelles vous choisiriez une méthode plutôt qu'une autre, et des avantages et inconvénients de chacune d'entre elles.

Comme Bill l'a dit, c'est un état pas une valeur.

Dans une ligne dans une table SQL Server, il est stocké dans le bitmap nul: aucune valeur n'est réellement stockée.

Une anomalie de SQL Server:

 SELECT TOP 1 NULL AS foo INTO dbo.bar FROM sys.columns 

Quel type de données est foo? Ça n'a pas de sens bien sûr, mais ça m'a rattrapé une fois.

Conceptuellement, NULL signifie "une valeur inconnue manquante" et il est traité différemment des autres valeurs.

En MySQL, 0 ou NULL signifie faux et tout le rest signifie vrai. La valeur de vérité par défaut d'une opération booleanne est 1.

Deux valeurs NULL sont considérées comme égales dans un GROUP BY.

Lorsque vous faites un ORDER BY, les valeurs NULL sont présentées en premier si vous faites ORDER BY … ASC et last si vous faites ORDER BY … DESC.

La valeur de NULL signifie essentiellement une valeur manquante, certaines personnes utiliseront également le terme inconnu

Une valeur Null n'est pas égale à quoi que ce soit, pas même une autre valeur NULL

Jetez un oeil à ces exemples

va imprimer est égal

 IF 1 = 1 PRINT 'is equaL' ELSE PRINT 'NOT equal' 

va imprimer est égal (une conversion implicite se produit)

 IF 1 = '1' PRINT 'is equaL' ELSE PRINT 'NOT equal' 

va imprimer n'est pas égal

 IF NULL = NULL PRINT 'is equaL' ELSE PRINT 'NOT equal'