如何使用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 ;
答案 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;
}
所以安德鲁是对的。