2012-01-17 83 views
3

如何使用char(2)將NULL值插入到數據庫字段(MySQL)中?將NULL值插入數據庫字段中,使用char(2)作爲類型

之前我用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最後PARAMS:

$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)字段具有default = 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 ; 
+4

NULL不應該用引號引起來,或者它被認爲是一個字符串 – Marco 2012-01-17 15:33:37

+2

「如果我回顯$ data [1]我得到NULL」如果你真的把它設置爲NULL,你不應該得到任何東西呼應。如果它返回NULL,那麼你實際上將它設置爲字符串「NULL」。你從var_dump($ data [1])得到了什麼? – Andrew 2012-01-17 16:52:17

+0

無論在PHP還是SQL中,NULL都是一個特殊的值,與NULL的字符串不同。否則,你怎麼能區分一個真正的null? – 2012-01-17 16:56:35

回答

0

我發現了這個問題。我正在讀出一個csv文件。該文件使用phpmyadmin導出,幷包含NULL字符串。我檢查

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

是不夠的,因爲它從來沒有檢查字符串NULL。所以解決辦法是:

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

所以安德魯是對的。

1

如果未指定主題行中的默認值或空你可以省略從列列表名稱在插入語句中。

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 | 
+---------+------+ 
相關問題