将NULL值插入数据库字段,并使用char(2)作为类型

时间:2012-01-17 15:31:04

标签: php mysql sql mysqli

如何使用char(2)将NULL值插入数据库字段(MySQL)?

在我使用mysql_query之前,我在数据库中输入了以下值:NU

而不是此值应该是NULL

阅读this question后,我转而准备好了陈述。我的数据库中仍然有NU

现在我的代码。我正在读取CSV行的行。然后我做

    if(empty($data[$c])) {
        $data[$c] = NULL;
    }

如果我回显$ data [1],我会得到NULL。然后我做了我准备好的查询:

$stmt = $connection->prepare("INSERT INTO table (first, second, ..) VALUES (?, ?, ...)");
$stmt->bind_param("ss...", $data[0], $data[1], ...);
$res=$stmt->execute();

有什么问题?

修改

据Shiplu说,我做了以下事情:

在不给出导致NU的最后一个参数的情况下执行此操作:

$stmt = $connection->prepare("INSERT INTO employee (first, second, ...) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->bind_param("sssssssssssssii", $data[0], $data[1], ..., $last);

使用default

$stmt = $connection->prepare("INSERT INTO employee (first, second, ..., last) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, default(last))");
$stmt->bind_param("sssssssssssssii", $data[0], $data[1], ...);

但结果仍然相同。 char(2)字段的默认值为NULL。怎么可能?似乎问题不在于查询。我认为最简单的解决方案是更新查询...

创建表格

CREATE TABLE IF NOT EXISTS `mytable` (
  `id` int(11) NOT NULL auto_increment,
  `text` varchar(128) default NULL,
  `no` int(11) default NULL,
  `problemfield` char(2) default NULL,
  PRIMARY KEY  (`id`),
  FULLTEXT KEY `text` (`text`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=832 ;

2 个答案:

答案 0 :(得分:1)

如果未指定主题行的默认值或为null,则可以省略insert语句中列列表中的名称。

mysql> create table t(
    -> n varchar(20),
    -> a char(2),
    -> primary key(`n`)
    -> );
Query OK, 0 rows affected (0.05 sec)

mysql> insert into t (n) values ('myname');
Query OK, 1 row affected (0.00 sec)

mysql> 
mysql> select * from t;
+--------+------+
| n      | a    |
+--------+------+
| myname | NULL |
+--------+------+
1 row in set (0.00 sec)

另一种技术是使用DEFAULT功能。但它只适用于 MySQL 。我不知道它是否适用于其他RDBMS引擎。

mysql> insert into t (a, n) values (default(a), 'myname1');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t;
+---------+------+
| n       | a    |
+---------+------+
| myname  | NULL |
| myname1 | NULL |
+---------+------+

答案 1 :(得分:0)

我发现了问题。我正在读出一个csv文件。此文件是使用phpmyadmin导出的,它包含NULL个字符串。我的支票

if(empty($data[$c])) {
    $data[$c] = NULL;
}

还不够,因为它从未检查过字符串NULL。所以解决方案是:

if(empty($data[$c]) || $data[$c]=='NULL') {
    $data[$c] = NULL;
}

所以安德鲁是对的。