[Интервью] В чем разница между значениями NULL и null в MySQL?

MySQL
[Интервью] В чем разница между значениями NULL и null в MySQL?

будь позитивным человеком

Пишите, исправляйте ошибки, улучшайте себя

У меня рай, ориентированный на программирование, и цветут весенние цветы!

01 История Оги

В качестве фоновой разработки, если вы хотите обращаться к базе данных Mysql в своей повседневной работе, вы неизбежно столкнетесь с NULL и нулевыми значениями в Mysql. Итак, вы знаете, в чем разница между ними?

Я не могу учиться, и я не хочу знать, в чем разница. Большой брат, нет, нам нужно интервью!

Несколько дней назад мой хороший друг Сяому пошел подавать заявление о приеме на работу, но после собеседования он вернулся, чтобы поболтать со мной, и вспомнил один из своих вопросов на собеседовании.


Интервьюер: Вы когда-нибудь использовали MySQL?

Коги: Да!

Интервьюер: Тогда не могли бы вы вкратце рассказать о разнице между значениями NULL и нулевыми значениями в Mysql?

Сяому: (думая...) Я использовал как NULL, так и нулевые значения. Вы хотите, чтобы я объяснил разницу между ними. Я действительно не думал об этом. В любом случае, это будет использоваться в реальной разработке!

Выслушав ответ Сяому.

Я сказал: Ваш ответ определенно неуместен, вы должны положить трубку на этом вопросе.

Сяому сказал: Разве NULL не переводится как NULL? Я действительно не думал об этом, это все еще довольно запутанно.


Чтобы другие партнеры не упали, как мой друг Сяому, и не упустили свою любимую компанию, когда столкнутся с этой проблемой, давайте кратко обсудим некоторые различия и способы их использования.

02 NULL и нулевые значения

NULL — это сохранение значения NULL в поле, а значение null — сохранение нулевого символа ('') в поле.

1. Разница в занимаемой площади

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

краткое содержание: Из приведенного выше видно, что длина нулевого значения ('') равна 0, что не занимает места; в то время как длина значения NULL равна NULL, на самом деле оно занимает место, см. следующее описание.

NULL columns require additional space in the row to record whether their values are NULL.

Столбцы NULL требуют дополнительного места в строке для записи того, является ли их значение NULL.

С точки зрения непрофессионала: нулевое значение похоже на преобразованную вакуумом чашку без ничего, а значение NULL - это чашка, наполненная воздухом.Хотя все они выглядят одинаково, между ними есть существенные различия.

2. Разница между методами вставки/запроса

создать таблицу,tb_test

CREATE TABLE `tb_test` (
  `one` varchar(10) NOT NULL,
  `two` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Вставьте для проверки:

-- 全部插入 NULL,失败
mysql> INSERT tb_test VALUES (NULL,NULL);
1048 - Column 'one' cannot be null
-- 全部插入 空值,成功
mysql> INSERT tb_test VALUES ('','');
Query OK, 1 row affected

Данные моделирования:

INSERT tb_test VALUES (1,NULL);
INSERT tb_test VALUES ('',2);
INSERT tb_test VALUES (3,3);

Пустое поле:

-- 使用 is null/is not null
mysql> SELECT * FROM tb_test where one is NULL;
Empty set

mysql> SELECT * FROM tb_test where one is not NULL;
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
|     | 2    |
| 3   | 3    |
+-----+------+
3 rows in set
-- 使用 = 、!=
mysql> SELECT * FROM tb_test where one = '';
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
+-----+-----+
1 row in set

mysql> SELECT * FROM tb_test where one != '';
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
| 3   | 3    |
+-----+------+
2 rows in set

Поле значения NULL:

-- 使用 is null/is not null
mysql> SELECT * FROM tb_test where two is not NULL;
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
| 3   | 3   |
+-----+-----+
2 rows in set

mysql> SELECT * FROM tb_test where two is NULL;
+-----+------+
| one | two  |
+-----+------+
| 1   | NULL |
+-----+------+
1 row in set

-- 使用 = 、!=
mysql> SELECT * FROM tb_test where two = '';
Empty set

mysql> SELECT * FROM tb_test where two != '';
+-----+-----+
| one | two |
+-----+-----+
|     | 2   |
| 3   | 3   |
+-----+-----+
2 rows in set

краткое содержание: Если вы хотите просто проверить столбец значения NULL, используйтеis NULLЧтобы проверить, просто проверьте столбец пустого значения (''), затем используйте=''.

Предлагаемый метод запроса: запрос со значением NULL использует запрос null/not null, а значение null ('') может использовать = или !=, и другие арифметические операторы.

3. Функции COUNT и IFNULL

использоватьCOUNTфункция:

mysql> SELECT count(one) FROM tb_test;
+------------+
| count(one) |
+------------+
|          3 |
+------------+
1 row in set

mysql> SELECT count(two) FROM tb_test;
+------------+
| count(two) |
+------------+
|          2 |
+------------+
1 row in set

mysql> SELECT count(*) FROM tb_test;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set

использоватьIFNULLфункция:

mysql> SELECT IFNULL(one,111111111) from tb_test WHERE one = '';
+-----------------------+
| IFNULL(one,111111111) |
+-----------------------+
|                       |
+-----------------------+
1 row in set

mysql> SELECT IFNULL(two,11111111) from tb_test where two is NULL;
+----------------------+
| IFNULL(two,11111111) |
+----------------------+
| 11111111             |
+----------------------+
1 row in set

краткое содержание: использование статистики COUNT(поля) отфильтрует значения NULL, но не отфильтрует нулевые значения.

Описание: IFNULL имеет два параметра. Если первое поле параметра неNULL, возвращается значение первого поля. в противном случае,IFNULLФункция возвращает значение второго параметра (значение по умолчанию).

4. Описание полей индекса

Я видел, как некоторые люди в Интернете говорят:В MySql, если столбец содержит NULL, индекс, содержащий столбец, недействителен.

даватьoneиtwoПоля добавляются с обычными индексами соответственно. Я писал это раньше, добавляя индекс к обзору:Сводка завершения индекса Mysql

-- ALTER TABLE table_name ADD INDEX index_name(col_name);
ALTER TABLE tb_test ADD INDEX index_oat (one, two);
ALTER TABLE tb_test add INDEX index_two(two);

использоватьshow keys from 表名;илиshow indexes from 表名;для просмотра всей информации индекса для этой таблицы.

Нормальный индекс, составной индекс.

Составные индексы подчиняются принципу «крайний левый префикс».,То есть, если в условии запроса используется первое поле составного индекса, то индекс будет использоваться.. Поэтому порядок индексированных столбцов в составном индексе имеет решающее значение.

Как видите, создаются два индекса, иindex_towСтолбец NULL соответствует ДА.

использоватьEXPLAINпоказывать,EXPLAINИнструкции по применению:Введение в использование объяснения в Mysql и значение поля результата

复合索引

普通索引

поисковый запросtwoПоля можно нормально индексировать. Я использую MYSQL 5.7,InnoDBдвигатель. Я также посмотрел некоторую информацию в Интернете.Влияние NULL на индексы в MySQLВ этой статье используются примеры для проверки,MySQL может использовать индексы для столбцов, содержащих значения NULL..

Примечание: Это может не работать в других условиях, см. информацию в Интернете и скажите, чтобы использовать空间索引Это не удастся, я не проверял это, и пространственный индекс не использовался. Проверьте официальный сайтcreate-index-spatial, заинтересованные партнеры могут убедиться сами.

Тут я думаю об одном, ответы на многие вопросы устанавливаются только при заданных условиях и средах, и еще вопросы и еще проверки.

краткое содержание: Использование часто используемых индексов для полей со значениями NULL, таких как обычные индексы, составные индексы, полнотекстовые индексы и т. д., не делает индексы недействительными. При просмотре пространственного индекса на официальном сайте указано, что столбец индекса должен быть NOT NULL.

03 Общее улучшение

Если вы можете общаться с интервьюером с точки зрения вышеперечисленных аспектов, даже если ответ не так совершенен, это лучше, чем ответ «Я использовал оба, и я не знаю конкретной разницы».

1. Значения NULL не занимают места, а значения NULL занимают место. Пустые значения также могут быть вставлены, когда поле не равно NULL.

2. Когда не используется NULL или NULL, он может выяснить, что в поле выясняется только, что в поле отсутствует ненуль или нуль, но не может обнаружить нулевое значение.

3. Используйте IS NULL или не является нулевым, чтобы судить о NULL, функцию IFNULL() можно использовать в функции оператора SQL для обработки, а нулевой символ можно обрабатывать с помощью ='' или ''.

4. При выполнении count() для подсчета количества записей в столбце, если используется значение NULL, система автоматически проигнорирует его, но значение NULL будет подсчитано.

5. Если столбец содержит NULL в MySql, индекс, содержащий столбец, недействителен. Эта фраза не очень точна.

6: Фактическое использование значения NULL или нулевого значения ('') различается в зависимости от фактического бизнеса. Лично предлагаю, чтобы в реальной разработке, если нет специального бизнес-сценария, вы можете напрямую использовать нулевое значение.

Вышеизложенное является моим завершением и размышлением над этой проблемой, я надеюсь, что это может помочь вам в интервью. Если у вас есть собственные мысли и понимание по этой теме, пожалуйста, оставьте сообщение для совместного обсуждения!

04 Ссылки

Блог Woohoo.cn на.com/как мне нравится/боюсь/…

Dev.MySQL.com/doc/Furious/…


Спасибо за чтение, если вы найдете этот пост в блоге полезным, пожалуйста, поставьте лайк, чтобы его увидело больше людей! Желаю тебе счастливого дня!



Что бы вы ни делали, пока вы продолжаете это делать, вы увидите разницу! На дороге ни смиренный, ни заносчивый!

Я надеюсь, что мы с тобой сможем стать лучшей версией себя на жизненном пути и стать одиноким человеком.

© Фейюнь, который с каждым днем ​​становится все лучше