1. ホーム
  2. データベース
  3. マイサク

MySQLのNULLについて解説した記事

2022-01-06 17:04:35

前置き

私はあなたがこのような問題に遭遇しているかどうか、我々はMySQLのデータベースを照会しているときに、書かれた条件は、ステータス!= 1、理論的にはクエリのすべての条件を満たしていないでしょう、しかし奇妙な結果NULLは、条件またはステータスIS NULLに接続する必要が見つかりませんでしたです。この記事では、MySQLのNULLを探ります。

1 MySQLにおけるNULL

MySQL では、NULL は特別な値です。

NULLとは、未知で不確定であることを意味し、NULLはどの値とも等しくない(それ自身を含む)。

2 NULLが占める長さ

データベース内のNULLが占める長さ

mysql> select length(NULL), length(''), length('1');
+--------------+------------+-------------+
| length(NULL) | length('') | length('1') | length(NULL) | length('1')
+--------------+------------+-------------+
| NULL | 0 | 1 |
+--------------+------------+-------------+


NULL列は、その値がNULLであるかどうかを記録するために、行に追加のスペースが必要です。

NULL値''の長さは0なのでスペースを取らず、NULLの長さはNULLなのでさらにスペースを取ることがわかります。開発仕様によっては、データベースフィールドをNot NULLに設定し、デフォルト値''や0を設定することが推奨されます。

3 NULL値の比較

IS NULLは、文字がヌルであり、ヌル文字または0を表さないかどうかを判断します。

標準SQL92では、! =NULL条件は常に偽を返し、集約は常に0を返すとされています。

もちろん、SET ANSI_NULLS OFF を使ってデータベースの標準モードをオフにすることもできますが、一般的にはそうすることは推奨されません。

したがって、ある数値がNULLに等しいかどうかを判断する唯一の方法は、IS NULLまたはIS NOT NULLを使用することです。

4 SQL における NULL 値の扱い

MySQLは、データ中のNULLを簡単に処理するための関数IFNULL(expr1,expr2)を提供しています。

IFNULLは2つの引数を持ちます。最初の引数のフィールドがNULLでない場合、最初のフィールドの値が返されます。そうでなければ、IFNULL関数は第2引数の値(デフォルト値)を返します。

select IFNULL(status,0) From t_user;


5 NULL値がクエリ条件に与える影響

  • =,<,> のような演算子は使用できません。NULLに対するいかなる算術演算の結果もNULLです(したがって、statusがNULLのとき、status!=1はNULLとしてカウントされません)。
  • COUNT(expr) 統計を使用する場合、フィールドがNULLのデータもカウントしない。

6 NULL 値がインデックスに与える影響

最初に注意すべき点は、MySQLのデータ列がNULLを含んでいても、必ずしもインデックスが失敗するとは限らないということです。

MySQLはNULLを含む列に対してインデックスを使用することができます。

NULL値を持つフィールドに通常のインデックス、複合インデックス、フルテキストインデックスなどの一般的なインデックスを使用しても、インデックスが無効になることはありません。しかし、空間インデックスを使用する場合、そのカラムはNOT NULLでなければなりません。

7 NULL 値がソートに与える影響

ORDER BYソートにおいて、NULL値がある場合、ASCを正順に並べた場合、NULLが一番小さく、NULLが一番上になります

正のソートでNULL値をリストの後ろに置く必要がある場合、ここでIS NULLを使用する必要があります。

select * from t_user order by age is null, age; 
or
select * from t_user order by isnull(name), age; 
# Equivalent to
select * from (select name, age, (age is null) as isn'tull from t_user) as foo order by isn'tull, age; 


8 NULLとNULLの違い

NULLは、フィールドにNULL値を格納することも意味し、NULLは、フィールドにヌル文字('')を格納することも意味します。

1. スペースの違い

mysql> select length(NULL), length(''), length('1');
+--------------+------------+-------------+
| length(NULL) | length('') | length('1') | length(NULL) | length('1')
+--------------+------------+-------------+
| NULL | 0 | 1 |
+--------------+------------+-------------+
1 row in set


要約:NULL('')の長さは0であり、スペースを取らず、NULLの長さはNULLであり、以下の説明のように実際にスペースを取ります。

NULL列は、その値がNULLであるかどうかを記録するために、行に追加のスペースが必要です。

NULL列は、その値がNULLであるかどうかを記録するために、行内に追加のスペースが必要です。

平たく言えば、NULL値は何も入っていない真空になったコップのようなもので、NULL値は空気が入っているコップで、同じように見えるが、根本的に違うのである。

要約すると

MySQL の NULL に関するこの記事は以上です。MySQL の NULL の詳細については、Script House の過去の記事を検索するか、引き続き以下の関連記事を参照してください。