Приложение A. Проблемы и распространенные ошибки |
Пред. |
|
След. |
A.5. Проблемы, относящиеся к запросам
A.5.3. Проблемы со значением NULL
Концепция NULL -значения часто вводит в заблуждение новичков в SQL, которые считают, что NULL - то же, что и пустая строка "" . Это ошибка! Например, следующие команды совершенно различны:
mysql> INSERT INTO my_table (phone) VALUES (NULL);
mysql> INSERT INTO my_table (phone) VALUES ("");
Обе команды вставляют значение в столбец phone , но первая - значение NULL , а вторая - пустую строку. Смысл первого можно передать как "номер телефона неизвестен", смысл второго - "у нее нет телефона".
В SQL сравнение значения NULL с любым другим значением, даже со значением NULL , всегда ложно. Выражение, содержащее NULL , всегда дает значение NULL , за исключением случаев, специально оговоренных в документации по операторам и функциям, присутствующим в выражении. Все столбцы в следующем примере возвращают NULL :
mysql> SELECT NULL,1+NULL,CONCAT('Invisible',NULL);
Если в столбце нужно найти значения NULL , то нельзя использовать условие =NULL . Следующая команда не возвращает ни одной строки, поскольку для любого выражения expr = NULL ЛОЖНО:
mysql> SELECT * FROM my_table WHERE phone = NULL;
Для поиска значений NULL необходимо использовать проверку IS NULL . Ниже показано, как найти телефонный номер NULL и пустой телефонный номер:
mysql> SELECT * FROM my_table WHERE phone IS NULL;
mysql> SELECT * FROM my_table WHERE phone = "";
Заметим, что добавлять индекс по столбцу, в котором допускаются значения NULL , можно только в случае, если вы работаете с версией MySQL 3.23.2 или выше, а используемый тип таблиц - MyISAM или InnoDB . В более ранних версиях или для других типов таблиц необходимо объявлять такие столбцы с атрибутом NOT NULL . Это также подразумевает, что тогда нельзя вставлять NULL в индексированный столбец.
При чтении данных с помощью LOAD DATA INFILE пустые поля обновляются значениями ". Если необходимо поместить в столбец значение NULL, то в текстовом файле следует использовать \N . Также при некоторых обстоятельствах можно использовать слово-литерал NULL (see Раздел 6.4.9, «Синтаксис оператора LOAD DATA INFILE »).
При использовании ORDER BY значения NULL выдаются первыми. В версиях предшествующих 4.0.2, при сортировке в убывающем порядке при помощи DESC , значения NULL также выдаются последними. При использовании GROUP BY все значения NULL считаются равными.
Для обработки NULL предназначены операторы IS NULL и IS NOT NULL , а также функция IFNULL() .
Для некоторых типов столбцов значения NULL обрабатываются специальным образом. Если NULL вставляется в первый в таблице столбец типа TIMESTAMP , то в него помещается значение текущей даты и времени. При вставке NULL в AUTO_INCREMENT -столбец вставляется следующее число последовательности.
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|