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.

  • <=>: عندما تكون القيمتان المتنافستان متساويتان أو كلاهما NULL، تعود عمليات المقارنة true.

تعتبر عمليات مقارنة القيم NULL عمليات خاصة. لا يمكنك استخدام = NULL أو != NULL للبحث عن القيم NULL في العمود.

في MySQL، مقارنة القيمة NULL مع أي قيمة أخرى (حتى القيمة NULL نفسها) دائمًا تعود NULL، أي NULL = NULL يعود NULL.

في MySQL، يتم استخدام عمليات الـ IS NULL و IS NOT NULL للتخلص من القيم NULL.

ملاحظة:

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

columnName1،columnName2 من نوع int، عندما يكون هناك قيمة null في columnName2، columnName1+columnName2=null، ifnull(columnName2,0) تحويل القيمة null في columnName2 إلى 0.

استخدام القيمة NULL في دليل الأوامر

في العينة التالية، افترض أن الجدول w3codebox_test_tbl في قاعدة البيانات w3codebox يحتوي على عمودين w3codebox_author و w3codebox_count، وتم تعيين القيمة NULL لـ w3codebox_count.

عينة عبر الإنترنت

جرب العينة التالية:

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
    -> ;
Query OK, 0 rows affected (0.05 sec)
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;
set فارغ (0.00 ثانية)
mysql> SELECT * FROM w3codebox_test_tbl WHERE w3codebox_count != NULL;
set فارغ (0.01 ثانية)

للبحث في جدول البيانات w3codebox_test_tbl عن وجود w3codebox_count كـ 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)

使用 PHP 脚本处理 NULL 值

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
           WHERE w3codebox_count = $w3codebox_count";
}
else
{
   $sql = "SELECT w3codebox_author, w3codebox_count
           FROM
           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);
?>

النتيجة تظهر في الشكل التالي: