MySQL の null と not null、null と空の値の違いの詳細な説明 ''''

MySQL の null と not null、null と空の値の違いの詳細な説明 ''''

MySQL を長い間使用してきた多くの人は、これら 2 つのフィールド属性の概念をまだよく理解しておらず、一般的に次のような疑問を抱いていると思います。

  • フィールド タイプが null ではないのに、null 値を挿入できるのはなぜですか?
  • なぜ null でない方が null より効率的でしょうか?
  • フィールドが空でないかどうかを判断する場合、select * from table where column <> '' を使用するか、select * from table where column is not null を使用するかどちらでしょうか?

上記の質問を念頭に置いて、null と not null の違いを詳しく見てみましょう。
まず、「null 値」と「NULL」の概念を明確にする必要があります。

  • 空の値はスペースを占有しません。
  • MySQL の NULL は実際にスペースを占有します。以下は MYSQL からの公式説明です。

「NULL 列には、その値が NULL であるかどうかを記録するために行に追加のスペースが必要です。MyISAM テーブルの場合、各 NULL 列は 1 ビット余分に必要となり、最も近いバイトに切り上げられます。」

たとえば、カップがある場合、null 値はカップが真空であることを意味し、NULL はカップが空気で満たされていることを意味します。カップは空に見えますが、その違いは非常に大きいです。

「null 値」と「NULL」の概念を明確にすると、問題は基本的に明らかになります。例を作ってテストしてみましょう。

テーブル「test」を作成します( 
 `col1` VARCHAR( 10 ) 文字セット utf8 COLLATE utf8_general_ci NOT NULL , 
 `col2` VARCHAR( 10 ) 文字セット utf8 COLLATE utf8_general_ci NULL 
) エンジン = MYISAM ; 

データを挿入:

`test` VALUES (null,1) に INSERT します。 

MySQL エラー:

#1048 - 列 'col1' は null にできません

もうひとつ

`test` VALUES ('',1) に挿入します。

正常に挿入されました。

NOT NULLフィールドには「NULL」を挿入できず、「null値」のみ挿入できることがわかります。上記の質問1の回答も利用可能です。

質問 2 に関して、NULL は実際には null 値ではないが、スペースを占有するということをすでに上で述べました。したがって、MySQL が比較を行うと、NULL がフィールド比較に参加し、効率にいくらか影響を及ぼします。
さらに、B ツリー インデックスには NULL 値が保存されないため、インデックス フィールドが NULL になる可能性がある場合、インデックスの効率は大幅に低下します。

テスト テーブルにさらにデータを挿入してみましょう。

`test` VALUES ('', NULL); に INSERT します。 
`test` に値 ('1', '2') を挿入します。 

表のデータは次のようになります。

ここで、要件に従って、col1 が空でないテスト テーブル内のすべてのデータをカウントします。「<> ''」と「IS NOT NULL」のどちらを使用すればよいでしょうか。結果の違いを見てみましょう。

SELECT * FROM `test` WHERE col1 IS NOT NULL

SELECT * FROM `test` WHERE col1 <> ''

ご覧のとおり、結果はかなり異なるため、ビジネス ニーズに基づいて、使用する検索条件を決定する必要があります。

MYSQLでは、列属性は可能な限りNOT NULLにすることを推奨しています。

長さの検証: 空の値の間にスペースがないことに注意してください。

mysql> length(''),length(null),length(' '); を選択します。

+------------+--------------+--------------+

| 長さ('') | 長さ(null) | 長さ(' ') |

+------------+--------------+--------------+

| 0 | NULL | 2 |

+------------+--------------+--------------+

注記:

  • count() を使用して列内のレコード数をカウントするときに NULL 値が使用されている場合、システムはそれを自動的に無視しますが、NULL 値はカウントされます。
  • NULL の判定には、IS NULL または IS NOT NULL を使用します。SQL ステートメント関数では、ifnull() 関数を使用して処理できます。NULL 文字の判定には、='' または <>'' を使用して処理します。
  • MySQL の特別な考慮事項: タイムスタンプ データ型の場合、このデータ型の列に NULL 値を挿入すると、表示される値は現在のシステム時刻になります。 null値を挿入すると、0000-00-00 00:00:00 が表示されます。
  • null 値の判定に is null を使用するか ='' を使用するかは、実際の業務に応じて使い分ける必要があります。

これで、MySQL の null と not null、および null と空の値の違いに関するこの記事は終了です。MySQL の null と not null の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL フィールドで NOT NULL を使用する必要があるのはなぜですか?
  • MySQL で not in を使用して null 値を含める問題を解決する
  • 設定操作からMySQLへのNULLが見つからない問題を解決する
  • MySQL でテーブルを作成するときの NULL と NOT NULL の使用方法の詳細な説明
  • MySQL の NOT IN 充填ピットの NULL 列の問題の解決方法
  • MySQL の null 可能フィールドは NULL に設定する必要がありますか、それとも NOT NULL に設定する必要がありますか?
  • MySQL クエリの空のフィールドまたは空でないフィールド (null または null ではない)
  • mysql は、含まれていない、左結合、IS NULL、NOT EXISTS の効率の問題のレコードです
  • MySQL の null 制約のケースの説明

<<:  Vue は PC カメラを呼び出してリアルタイムで写真を撮る機能を実装します

>>:  Docker Hubの動作原理と実装プロセスの分析

推薦する

CSS で TikTok テキスト揺れエフェクトを実装する例

日々の開発において、フロントエンドの学生はアニメーションやデザインについてよく議論します。デザイナー...

CSS3+HTML5+JSでブロックの縮小・拡大アニメーション効果を実現

最近、あるプロジェクトに取り組んでいたとき、自分のプロジェクトでは CSS3 のアニメーション技術を...

モバイルの赤い封筒の雨機能ページを実装するための JavaScript HTML

この記事の例では、モバイル紅包雨機能ページを実現するためのHTMLの具体的なコードを共有しています。...

Windows 10 での Hyperledger Fabric 1.4 環境構築プロセスの図

内容Hyperledger fabric1.4環境のWindows 10でのセットアップ前提条件Wi...

虫眼鏡ケースのJavaScriptオブジェクト指向実装

この記事では、参考までに、虫眼鏡のJavaScriptオブジェクト指向実装の具体的なコードを紹介しま...

bash を使って日付をカウントダウンする方法

重要なイベントまであと何日あるか知りたいですか? Linux bash と date コマンドが役に...

MySQL mysqldump の使い方の詳しい説明

1. mysqldump の紹介mysqldump は、MySQL に付属する論理バックアップ ツー...

MySQL 結合テーブルと ID 自動増分の例の分析

結合の書き方左結合を使用する場合、左側のテーブルが必ず駆動テーブルになりますか? 2 つのテーブルの...

VirtualBox を使用して Linux クラスターをシミュレートする方法

1. ホストMacbookにHOSTをセットアップする前回のドキュメントでは仮想マシンの静的 IP ...

ポートマッピング後に Docker コンテナが突然接続に失敗する問題のトラブルシューティング プロセス

1. 背景通常、外部サービスを提供する必要がある Docker コンテナの場合、起動時に -p コマ...

エラー 1045 (28000): ユーザー ''root''@''localhost'' のアクセスが拒否されました (パスワード使用: YES) 実用的な解決策

昨日はデータベースへの接続に問題はありませんでしたが、今日はデータベースへの接続時にこのエラーが報告...

MySQL データベース面接に必須の 3 つのログの紹介

目次1. redo ログ (MySQL ストレージ エンジン InnoDB のトランザクション ログ...

Baotaパネルを再起動すると、「-ModuleNotFoundError: No module named 'geventwebsocket'」というメッセージが表示されます。

背景:サーバーがFlaskプロジェクトをデプロイし、python3をインストールしたため、再起動時に...

Linux dirnameコマンドの具体的な使い方

01. コマンドの概要dirname - ファイル名からディレクトリ以外のサフィックスを削除しますd...

フレックスレイアウトとposition:absolute/fixedの競合の詳細な説明

以前、プロジェクトを開発しているときに、flex レイアウトと position:absolute/...