2012-01-17 14 views
3

NULLの値をchar(2)のデータベースフィールド(MySQL)に挿入するにはどうすればよいですか? char(2)型のデータベースフィールドにNULL値を挿入してください

は私が mysql_query使用する前に、私は、データベースに次の値だ: NU

代わりにこの値のNULLがあるはずですが。

this questionを読んだ後、私は準備文に切り替えました。私はまだNUを私のデータベースに持っています。

私のコードにしてください。私はCSVの行のための行を読んでいます。それから私は、私は$データをエコー場合

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

は、[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与えることなく、それを実行します。defaultを使用して

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

を:

$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 ; 
+4

'NULL'は引用符で囲まれていてはいけません。それは文字列とみなされます。 – Marco

+2

" $ data [1]を返すとNULLになります "実際に' NULL'に設定した場合、エコー。NULLを返している場合は、実際には文字列 '' NULL ''に設定します。あなたは 'var_dump($ data [1])'から何を得ますか? – Andrew

+0

PHPとSQLの両方で、 'NULL'は' NULL''文字列と同じではない特別な値です。それ以外の場合は、どうすれば実際のnullを区別できますか? –

答えて

0

この問題が見つかりました。私はCSVファイルを読んでいた。このファイルはphpmyadminでエクスポートされ、NULL文字列が含まれていました。それは文字列NULLをチェックしたことがないので、私のチェック

if(empty($data[$c])) { 
    $data[$c] = 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 | 
+---------+------+ 
関連する問題