MySQL 和 PHP - 插入 NULL 而不是空字符串

Posted

技术标签:

【中文标题】MySQL 和 PHP - 插入 NULL 而不是空字符串【英文标题】:MySQL and PHP - insert NULL rather than empty string 【发布时间】:2011-06-04 23:00:02 【问题描述】:

我有一个 mysql 语句将一些变量插入到数据库中。我最近添加了 2 个可选字段($intLat、$intLng)。现在,如果没有输入这些值,我会传递一个空字符串作为值。如何将显式 NULL 值传递给 MySQL(如果为空)?

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  '$intLat', '$intLng')";
mysql_query($query);

【问题讨论】:

【参考方案1】:

这对我来说很好用:

INSERT INTO table VALUES ('', NULLIF('$date',''))

(第一个 '' 增加 id 字段)

【讨论】:

NULLIF 采用 2 个参数 NULLIF(expr1, expr2) 。见dev.mysql.com/doc/refman/5.7/en/… 我认为这样更好,因为你可以在一行中完成 准备好的语句不是那么简单。【参考方案2】:

您所要做的就是:$variable =NULL; // 并在插入查询中传递它。这会将值作为 NULL 存储在 mysql db 中

【讨论】:

“NULL”周围不需要引号。【参考方案3】:

要将 NULL 传递给 MySQL,您只需这样做。

INSERT INTO table (field,field2) VALUES (NULL,3)

因此,在您的代码中,检查 if $intLat, $intLng 是否为 empty,如果是,请使用 NULL 而不是 '$intLat''$intLng'

$intLat = !empty($intLat) ? "'$intLat'" : "NULL";
$intLng = !empty($intLng) ? "'$intLng'" : "NULL";

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  $intLat, $intLng)";

【讨论】:

这不会添加 mysql NULL 值。这将属性设置为字符串“NULL”,这与 mysql NULL 值不同。我只是说你写了两个不同的东西,第一个是正确的,第二个不是我认为的。 @G4bri3l:在$query 字符串中,$intLat$intLng 没有被引用。所以,当变量被插值时,它将是, NULL, NULL); 哦,是的,我现在看到了。好的!感谢您花时间向我指出;) @G4bri3l:没有问题。我是来帮忙的:) @alessadro:这个问题很老了。如果您将变量连接到这样的 SQL 查询中,那么您做错了!请切换到在 PDO 或 MySQLi 中使用准备好的语句。【参考方案4】:

您的查询可以如下:

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
      VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$lng', '" . ($lat == '')?NULL:$lat . "', '" . ($long == '')?NULL:$long . "')";
mysql_query($query);

【讨论】:

$intLat 和 $intLng 是可选的。 这行不通。这段代码 sn-p 有很多问题(除了使用错误的变量,正如 Rocket 指出的那样)。由于三元运算符的优先级,您需要在表达式周围加上括号。但至关重要的是,您仍然将列值括在单引号中,因此您返回到第一个方格,分配一个字符串,而不是数据库NULL。此外,您正在使用 phps NULL(未加引号)关键字,它在字符串上下文中计算为空字符串,因此,您再次分配了一个 empty string【参考方案5】:

由于某种原因,radhoo 的解决方案对我不起作用。当我使用以下表达式时:

$query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
    (($val1=='')?"NULL":("'".$val1."'")) . ", ".
    (($val2=='')?"NULL":("'".$val2."'")) . 
    ")";

'null'(带引号)被插入而不是不带引号的 null,使其成为字符串而不是整数。所以我终于尝试了:

$query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
    (($val1=='')? :("'".$val1."'")) . ", ".
    (($val2=='')? :("'".$val2."'")) . 
    ")";

空白导致将正确的空值(未加引号)插入到查询中。

【讨论】:

【参考方案6】:

通常,您从 PHP 向 mySQL 添加常规值,如下所示:

function addValues($val1, $val2) 
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES ('$val1', '$val2')";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB

如果您的值为空/null($val1=="" 或 $val1==NULL),并且您希望将 NULL 添加到 SQL 而不是 0 或空字符串,则添加到以下内容:

function addValues($val1, $val2) 
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
        (($val1=='')?"NULL":("'".$val1."'")) . ", ".
        (($val2=='')?"NULL":("'".$val2."'")) . 
        ")";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB

注意 null 必须添加为 "NULL" 而不是 "'NULL'" 。非空值必须添加为 "'".$val1."'" 等。

希望这会有所帮助,我只需要将它用于一些硬件数据记录器,其中一些收集温度和辐射,另一些只收集辐射。对于那些没有温度传感器的人,我需要 NULL 而不是 0,原因很明显(0 也是可接受的温度值)。

【讨论】:

对于列定义的整数,其他解决方案可以正常工作,但是对于文本字段,我必须将上面的查询分解为字符串连接,就像上面的 radhoo 一样。 $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES ("."NULL".", ".$val2.")";【参考方案7】:

你可以这样做,例如

UPDATE `table` SET `date`='', `newdate`=NULL WHERE id='$id'

【讨论】:

【参考方案8】:

在构建查询之前检查变量,如果它们为空,则将它们更改为字符串NULL

【讨论】:

【参考方案9】:

如果你不传递值,你会得到默认值的空值。

但你可以只传递不带引号的 NULL。

【讨论】:

如果表是这样设置的,他只会得到 NULL 默认值。 对我来说这就是“可选”的意思。 太棒了,它有效

以上是关于MySQL 和 PHP - 插入 NULL 而不是空字符串的主要内容,如果未能解决你的问题,请参考以下文章

调试 PDO mySql 将 NULL 插入数据库而不是空

在 MYSQL 中执行 LEFT OUTER JOIN 时插入零而不是 NULL

PHP中的SQL插入两行而不是一行

如何使用参数化输入将 NULL 值从 nodeJS/javascript 插入 MySQL?

MySQL INSERT 将 BIT 插入 1 而不是 0

mysql的更新问题