Как вставить значение NULL
в поле базы данных (MySQL) с char (2)?
Прежде чем я использовал mysql_query
и я получил в базе данных следующее значение: NU
Вместо этого значения должно быть NULL
.
Прочитав этот вопрос, я перешел к подготовленным заявлениям. У меня все еще есть 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();
Что не так?
Редактировать:
По словам Шиплу, я сделал следующее:
Сделайте это без предоставления последних параметров, которые вызывают 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 ;
Если значение по умолчанию для строки темы не указано или значение 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 | +---------+------+
Я нашел проблему. Я читал файл csv. Этот файл был экспортирован с помощью phpmyadmin и содержал NULL
строки. Мой чек
if(empty($data[$c])) { $data[$c] = NULL; }
было недостаточно, потому что он никогда не проверял строку NULL
. Таким образом, решение:
if(empty($data[$c]) || $data[$c]=='NULL') { $data[$c] = NULL; }
Так что Андрей был прав.