我有一个csv文件,我试图写入mysql表。
file.csv
id,name,age,job
5,John Smith,34,Janitor
7,Jane Smith,,Teacher
9,Jim Bob,23,Coach
table
CREATE TABLE `table` (
`id` smallint(3) unsigned NOT NULL,
`name` varchar(30) DEFAULT NULL,
`age` tinyint(3) unsigned DEFAULT NULL,
`job` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我的问题是,即使age
默认为NULL,Jane Smith的年龄的空值也会作为0插入到我的MySQL表中。我使用以下fgetcsv()PHP。
$f = '/home/file.csv';
$file = fopen($f,'r');
fgetcsv($file); // skips 1st line with headers
while (($data = fgetcsv($file,0,",")) !== FALSE) {
if (array(null) !== $data) {
$id = $data[0];
$name = $data[1];
$age = $data[2];
$job = $data[3];
$bind_params = array(
':id' => $id,
':name' => $name,
':age' => $age,
':job' => $job
);
$stmt = $conn->prepare("INSERT INTO table (id, name, age, job) VALUES (:id, :name, :age, :job)");
$stmt->execute($bind_params);
}
}
我已经详细阅读了http://php.net/manual/en/function.fgetcsv.php和https://dev.mysql.com/doc/refman/5.5/en/load-data.html,但我无法弄明白。我已经替换了" NULL",""," \ N",NULL和\ N之间,但我还没有得到了任何不同的结果。我也尝试过显式输入fgetcsv()的可选参数,如php.net上的示例所示。
array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = "," [, string $enclosure = '"' [, string $escape = "\\" ]]]] )
我错过了什么!?谢谢。
其他信息: 我更喜欢这是一个php / fgetcsv解决方案而不是纯MySQL解决方案,因为上面的数据只是一个快照(总共有99列),并且许多列在插入到其他表之前都是php计算的输入。 / p>
答案 0 :(得分:0)
csv中的空值由PHP的fgetcsv()读取为空字符串,而不是真正的NULL值。在绑定变量(对于PDO)和插入MySQL表之前,仅将那些空字符串变量(通过if()语句)重新分配给NULL值。
从@u_mulder输入之后,我将每个变量包装在查找空字符串的if语句中,如果空字符串为true,则将该变量赋值为value = null。由于我有99列,我将把它放到for()循环中以获取所有列。
for ($i=0; $i<=99; $i++) {
if($data[$i] === "") { $data[$i] = null; }
}
我实现了它,它完全按照我最初的需要工作。
修改强> 我更新了代码以使用===而不仅仅是==。我发现双等号是将零转换为空值。由于我只想要完全空的字符串,所以需要第三个等号。