English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Обработка NULL-значений MySQL

Мы уже знаем, что MySQL использует команду SQL SELECT и подзапрос WHERE для чтения данных из таблицы, но когда предоставляемое поле запроса является NULL, эта команда может не работать корректно.

Чтобы обработать这种情况, MySQL предоставляет три основных оператора:

  • IS NULL: Когда значение столбца является NULL, этот оператор возвращает true.

  • IS NOT NULL: Когда значение столбца не является NULL, оператор возвращает true.

  • <=>: Операторы сравнения (не такие как = оператор), возвращает true, когда сравниваемые значения равны или оба из них NULL.

Операции сравнения условий с NULL являются особенными. Вы не можете использовать = NULL или != NULL для поиска значения NULL в столбце.

В MySQL сравнение значения NULL с любым другим значением (даже с NULL) всегда возвращает NULL, то есть NULL = NULL возвращает NULL.

В MySQL обработка NULL выполняется с помощью операторов IS NULL и IS NOT NULL.

Внимание:

select * , columnName1 + ifnull(columnName2, 0) from tableName;

columnName1, columnName2 являются типом int, когда в columnName2 есть значение NULL, columnName1 + columnName2 = null ifnull(columnName2, 0) преобразует значение NULL в columnName2 к 0.

Использование значения NULL в командной строке

В следующем примере предполагается, что таблица w3codebox_test_tbl базы данных w3codebox содержит две колонки w3codebox_author и w3codebox_count, в которой для w3codebox_count установлены значения NULL.

Онлайн пример

Попробуйте следующий пример:

root@host# mysql -u root -p password;
Введите пароль:*******
mysql> use w3codebox;
База данных изменена
mysql> create table w3codebox_test_tbl
    -> (
    -> w3codebox_author VARCHAR(40) NOT NULL,
    -> w3codebox_count INT
    -> ;
Запрос выполнен, затронутых строк 0 (0.05 сек)
mysql> INSERT INTO w3codebox_test_tbl (w3codebox_author, w3codebox_count) VALUES ('w3codebox', 20);
mysql> INSERT INTO w3codebox_test_tbl (w3codebox_author, w3codebox_count) VALUES ('基础教程网', NULL);
mysql> INSERT INTO w3codebox_test_tbl (w3codebox_author, w3codebox_count) VALUES ('Google', NULL);
mysql> INSERT INTO w3codebox_test_tbl (w3codebox_author, w3codebox_count) VALUES ('FK', 20);
 
mysql> SELECT * from w3codebox_test_tbl;
+---------------+--------------+
| w3codebox_author | w3codebox_count |
+---------------+--------------+
| w3codebox        | 20           |
| 基础教程网  | NULL         |
| Google        | NULL         |
| FK            | 20           |
+---------------+--------------+
4 строк в наборе (0.01 сек)

В следующем примере вы можете увидеть, что операторы = и != не работают:

mysql> SELECT * FROM w3codebox_test_tbl WHERE w3codebox_count = NULL;
Пустой набор (0.00 сек)
mysql> SELECT * FROM w3codebox_test_tbl WHERE w3codebox_count != NULL;
Пустой набор (0.01 сек)

Для поиска данных в таблице w3codebox_test_tbl, где столбец IS NULL, необходимо использовать IS NULL и IS NOT NULL,например: }}

mysql> SELECT * FROM w3codebox_test_tbl WHERE w3codebox_count IS NULL;
+---------------+--------------+
| w3codebox_author | w3codebox_count |
+---------------+--------------+
| 基础教程网  | NULL         |
| Google        | NULL         |
+---------------+--------------+
2 rows in set (0.01 sec)
 
mysql> SELECT * from w3codebox_test_tbl WHERE w3codebox_count IS NOT NULL;
+---------------+--------------+
| w3codebox_author | w3codebox_count |
+---------------+--------------+
| w3codebox        | 20           |
| FK            | 20           |
+---------------+--------------+
2 rows in set (0.01 sec)

Обработка NULL значений с помощью PHP скрипта

В PHP скрипте вы можете использовать оператор if...else, чтобы обрабатывать пустые переменные и генерировать соответствующие условия.

В следующем примере PHP устанавливает переменную $w3codebox_count и затем использует ее для сравнения с полем w3codebox_count в таблице данных:

<?php
$dbhost = 'localhost';  // mysql服务器主机地址
$dbuser = 'root';            // mysql用户名
$dbpass = '123456';          // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
    die('连接失败: ' . mysqli_error($conn));
}
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");
 
if( isset($w3codebox_count ))
{
   $sql = "SELECT w3codebox_author, w3codebox_count
           FROM  w3codebox_test_tbl
           WHERE w3codebox_count = $w3codebox_count";
}
else
{
   $sql = "SELECT w3codebox_author, w3codebox_count
           FROM  w3codebox_test_tbl
           WHERE w3codebox_count IS NULL";
}
mysqli_select_db( $conn, 'w3codebox' );
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
    die('Не удалось прочитать данные: ' . mysqli_error($conn));
}
echo '<h2>Основной учебник(oldtoolbag.com) IS NULL тест<h2>';
echo '<table border="1"><tr><td>Автор</td><td>Количество логинов</td></tr>';
while($row = mysqli_fetch_array($retval))
{
    echo "<tr>".
         "<td>{$row['w3codebox_author']} </td> ".
         "<td>{$row['w3codebox_count']} </td> ".
         "</tr>";
}
echo '</table>';
mysqli_close($conn);
?>

Результат вывода показан на рисунке ниже: