MySQL で null 値と空文字 ('') を区別する

MySQL で null 値と空文字 ('') を区別する

日常の開発では、データベースの追加、削除、変更、クエリが一般的に行われるため、Mysql で NULL や空文字に遭遇することは避けられません。
空文字 ('') と null 値 (null) は空であるように見えますが、いくつかの違いがあります。

意味:

  • NULL値(NULL)の長さはNULLであり、どのくらいの記憶領域を占有するかは不明であるが、占有する記憶領域は
  • 空の文字列 ('') の長さは 0 であり、スペースを占有しません。

簡単に言うと:

空の文字列 ('') は、何も入っていない真空カップのようなものです。
NULL 値は空気で満たされたカップのようなものですが、中には何かが含まれています。
どちらも空で透明に見えますが、両者の間には本質的な違いがあります。

違い:

  1. count() を使用して列をカウントする場合、null 値は無視されますが、空の文字はカウントされます。ただし、count(*) は、null 値を含む行の合計数を直接返すように最適化されます。
  2. null が存在するかどうかを判断するには、 is nullまたはis not nullを使用します。SQL では、 ifnull()関数を使用してこれを処理できます。null 文字が存在するかどうかを判断するには、 =''または!=''を使用します。
  3. タイムスタンプデータ型の場合、NULL値を挿入すると現在のシステム時刻になり、空白文字を挿入すると0000-00-00 00:00:00になります。

例:

  • 新しいテーブル test_ab を作成し、4 行のデータを挿入します。
CREATE TABLE test_ab (id int,
	col_a varchar(128)、
	col_b varchar(128) NULLではない
);

test_ab(id,col_a,col_b) の値(1,1,1) を挿入します。
test_ab(id,col_a,col_b) 値(2,'','') を挿入します。
test_ab(id,col_a,col_b) 値(3,null,'') を挿入します。
test_ab(id,col_a,col_b) に値(4,null,1) を挿入します。

mysql> test_ab から * を選択します。
+------+-------+-------+
| id | 列a | 列b |
+------+-------+-------+
| 1 | 1 | 1 |
| 2 | | |
| 3 | NULL | |
| 4 | NULL | 1 |
+------+-------+-------+
セット内の 4 行 (0.00 秒)
  • まず、空文字 ('') と空の値 (null) のクエリ メソッドの違いを比較してみましょう。
mysql> test_ab から * を選択します。 where col_a = '';
+------+-------+-------+
| id | 列a | 列b |
+------+-------+-------+
| 2 | | |
+------+-------+-------+
セット内の 1 行 (0.00 秒)

mysql> col_a が null である test_ab から * を選択します。
+------+-------+-------+
| id | 列a | 列b |
+------+-------+-------+
| 3 | NULL | |
| 4 | NULL | 1 |
+------+-------+-------+
セット内の 2 行 (0.00 秒)

null''のクエリ方法が異なることがわかります。また、比較文字「=」、「>」、「<」、「<>」は null の照会には使用できません。
null 値を照会する必要がある場合は、is null と is not null を使用します。

  • 2番目の比較は操作に関するものである
mysql> test_ab から col_a+1 を選択します (id = 4)。
+---------+
| 列a+1 |
+---------+
| NULL |
+---------+
セット内の 1 行 (0.00 秒)

mysql> test_ab から col_b+1 を選択します (id = 4)。
+---------+
| 列b+1 |
+---------+
| 2 |
+---------+
セット内の 1 行 (0.00 秒)

このことから、null 値は計算に参加できないことがわかります。null 値は計算に参加すると空になるからです。
したがって、プログラム業務において計算を行う場合には、特に注意を払う必要があります。
計算に含める必要がある場合は、通常の計算のために ifnull 関数を使用して null を''に変換する必要があります。

  • 3番目の比較は統計量である
mysql> test_ab から count(col_a) を選択します。
+--------------+
| カウント(col_a) |
+--------------+
| 2 |
+--------------+
セット内の 1 行 (0.00 秒)

mysql> test_ab から count(col_b) を選択します。
+--------------+
| カウント(col_b) |
+--------------+
| 4 |
+--------------+
セット内の 1 行 (0.00 秒)

このことから、数を数えると次のことがわかります。 null値は有効な値としてカウントされません。
同様に、sum() を使用して合計を計算する場合、null はカウントされないので、理解できます。
null を計算すると結果が空になるのに、sum() を使用して合計すると結果が正常になるのはなぜですか?

結論は:

したがって、デフォルト値を設定するときは、デフォルト値として null を使用しないようにしてください。フィールドが int 型の場合、デフォルト値は 0 です。varchar 型の場合、デフォルト値としては空の文字列 ('') の方が適しています。 null を含むデフォルト値もインデックス付けできますが、効率は影響を受けます。もちろん、フィールドにインデックスが作成されないことが確実な場合は、null に設定できます。

フィールドを設定するときは、not null の概念がデフォルト値と競合しないため、not null に設定できます。デフォルト値を ('') に設定すると、null 状況を回避できますが、フィールドに null 値が直接割り当てられる可能性があり、データベースに null が引き続き表示されるため、フィールドに not null を追加することを強くお勧めします。

次のようなものです:

mysql> alter table test_ab `col_b` varchar(128) NOT NULL DEFAULT '' を変更します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
レコード: 0 重複: 0 警告: 0

mysql> desc test_ab;
+-------+--------------+------+-----+--------+-------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 |
+-------+--------------+------+-----+--------+-------+
| id | int | はい | | NULL | |
| col_a | varchar(128) | はい | | NULL | |
| col_b | varchar(128) | いいえ | | | |
+-------+--------------+------+-----+--------+-------+
セット内の 3 行 (0.00 秒)

ストレージスペースとインデックスのパフォーマンスの点では NULL 文字より悪くないかもしれませんが、その特殊性を回避し、プロジェクトに不確実性をもたらすために、NULL をデフォルト値として使用しないことをお勧めします。

以上がMySQLにおけるnull値と空文字('')の区別の詳細です。MySQLのnull値と空文字の詳細については、123WORDPRESS.COMの他の関連記事に注目してください!

以下もご興味があるかもしれません:
  • MySQLの空の値とnull値の違いを知っていますか?
  • MySQL における null 値と空文字 '' の具体的な使用法

<<:  GTK ツリービューの原理と使用法の分析

>>:  Vue3 のリアクティブ関数 toRef 関数 ref 関数の紹介

推薦する

MySQLクエリのパフォーマンスに影響を与える大きなオフセットの理由と最適化の詳細な説明

序文MySQL クエリは select コマンドを使用し、limit および offset パラメー...

Linuxの相対パスと絶対パスの使用

01. 概要絶対パスと相対パスはシェル環境でよく使用され、それぞれに独自の用途があります。相対パスの...

VMware 仮想マシンでの Centos8 ブリッジの静的 IP 設定方法

1. ネットワーク接続方法がブリッジされていることを確認する物理ネットワーク接続ステータスのコピーを...

Centos6.6 で php7 + nginx 環境をインストールする方法

この記事では、centos6.6 で php7 + nginx 環境をインストールする方法について説...

Linux での Firewalld の高度な設定の使用に関する詳細な説明

IPマスカレードとポート転送Firewalldは2種類のネットワークアドレス変換をサポートしています...

美容・スタイリングウェブサイト向けのカラーマッチングテクニックと効果表示

色はあらゆるウェブサイトにとって最も重要な要素の 1 つであり、閲覧者に大きな影響を与えるため、色の...

Linux で MySQL データベースのスケジュールされたバックアップを実装する簡単な方法

詳細な手順は次のとおりです。 1. ディスク容量を確認します。 [root@localhost バッ...

Vueのdiffアルゴリズムについての簡単な説明

目次概要バーチャルドム原理実装プロセスパッチ方式sameVnode関数patchVnode関数upd...

初心者向けMySQLシリーズチュートリアル

目次1. 基本概念と基本コマンド1) 基本的な概念2) 基本コマンド2. SQL文の記述順序と実行順...

Tomcat は、Springboot プロジェクトの WAR パッケージの起動時にエラーを報告します: 子の起動時にエラーが発生しました

今日、会社の Springboot プロジェクトは、テストのためにテスト サーバーにデプロイする準備...

vueプロジェクトは特定の領域に透かしを描くことを実現する

この記事では、Vueを使用して特定の領域に透かしを描く方法を紹介します。具体的な内容は次のとおりです...

Linux のソフトリンクとハードリンクの詳細な説明

目次1. ファイルとディレクトリの基本的な保存2. Inコマンドの紹介(1)lnコマンドの基本情報を...

JavaScript で localStorage を使用する方法

.NET の世界に参入したい開発者であれば、何が可能なのかを知る必要があります。 .NET Fram...

JavaScript における一般的な配列操作

目次1. 連結() 2. 結合() 3. プッシュ() 5. シフト() 6. シフト解除() 7....

Nodejs でモジュール fs ファイルシステムを使用する方法

目次概要ファイル記述子同期、非同期、Promise同期書き込み非同期書き込み(推奨)約束​​の書き方...