この短い記事は何についてですか?
以前、PHPHub 移行データベース ファイルの nullable とインデックスの問題について誰かが質問しているのを見かけました。MySQL を使用している多くの人は、長い間 (特に、普段ビジネス開発に過度に注意を払っている人) は、これら 2 つのフィールド属性の概念についてあまり明確ではなく、通常次のような疑問を抱いています:
私のフィールド タイプは null ではありませんが、なぜですかnull 値を挿入できますか;
Not null は null よりも効率的です;
フィールドが空ではないと判断する場合、列 '' を使用する必要がありますか、それとも列を使用する必要がありますか?はヌルではありません。
上記の質問を踏まえて、null と not null の違いを詳しく見てみましょう。
null は null 値と同じですか?
まず、null 値と null の概念を理解する必要があります。
Null値はスペースを占有しません;MySQL の
#null は実際にスペースを占有します。以下は MYSQL からの公式説明です:
NULL 列は、行内に追加のスペースが必要かどうかを記録します。それらの値は NULL です。MyISAM テーブルの場合、各 NULL 列は 1 ビット余分に取り、最も近いバイトに切り上げられます。
たとえば、カップがあります。NULL 値は、カップがは真空、NULL 値はカップが真空であることを意味します。カップは空気で満たされています。カップは空に見えますが、その違いは非常に大きいです。
ちょっと栗目な
「NULL 値」と「NULL」の概念を理解すると、問題は基本的に明確になります。例を使ってテストしてみましょう:
CREATE TABLE `test` ( `col1` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `col2` VARCHAR( 10 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL ) ENGINE = MYISAM ;
質問 1: 私のフィールド タイプは null ではありませんが、なぜ null 値を挿入できるのですか?
次の SQL を実行すると、列 'col1' を null にすることはできないことを示すエラーが発生します。
INSERT INTO `test` VALUES ( null, 1);
もう 1 つ、実行は成功しました。
INSERT INTO `test` VALUES ('',1);
NOT NULL フィールドに NULL を挿入することはできず (これはナンセンスではないでしょうか?)、挿入できるのは NULL 値のみであり、上記の質問 1 に対する答えがそこにあります。
質問 2: null ではない方が null より効率的なのはなぜですか?
質問 2 については、上で述べたように、NULL は実際には null 値ではなく、領域を占有するため、mysql が比較を実行する際にフィールド比較に NULL が関与するため、効率に部分的に影響します。 . .
また、B ツリー インデックスは NULL 値を格納しないため、インデックス付けされたフィールドが NULL になる可能性がある場合、インデックス効率が大幅に低下します。
質問 3: フィールドが空ではないと判断する場合、column<>'' を使用する必要がありますか、それとも column is not null を使用する必要がありますか。
テスト テーブルにいくつかのデータを挿入しましょう:
INSERT INTO `test` VALUES ('', NULL); INSERT INTO `test` VALUES ('1', '2');
要件に従って、col1 が空ではないテスト テーブル内のすべてのデータをカウントしたいとします。 <> ;'' または IS NOT NULL を使用する場合、結果の違いを見てみましょう。
#テーブル内のデータは次のようになります:次の 2 つの SQL 文の実行効果をそれぞれ比較してくださいSELECT * FROM `test` WHERE col1 IS NOT NULL
SELECT * FROM `test` WHERE col1 <> ''
#ご覧のとおり、結果は大きく異なるため、どのような種類の検索条件を使用するか、ビジネス ニーズに基づいて null を使用するかどうかを判断する必要があります。 。
私が遭遇した小さな落とし穴ずっと前に初めて会社に入社し、最初の要件をオンラインで作成したとき、効率比がゼロではないことに気づいただけでした。 . null は効率的です。
わかりました~ 既存のテーブルにフィールドを追加するとき、すべてのフィールドを null 以外に設定しましたが、愚かだと感じました。
多くのサービスにはこのテーブルを操作するための挿入アクションがあるため、結果はご想像のとおりです。テーブルがオンラインになった直後、開発チーム全体の全員のメールボックスに「列 'col1' を null にすることはできません」というエラーが表示されました。 。
したがって、ビジネス量がそれほど大きくない場合、実際には多くのテクノロジーの使用を実態に基づいて総合的に検討する必要があります。
以上がMySQLのNULLとNOT NULLの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。