背景:和第三方服务商协调检测数据的时候,从他们后台导出了存放数据的csv文件。于是,需要将该文件内的数据导入到自己的mysql库中,写了一段代码如下:
// 将csv文件数据插入到mysql数据库中
if(file_exists(ROOT_PATH.'data.csv')){
set_time_limit(0);
$i = 0;
$file = fopen(ROOT_PATH.'data.csv','r');
while ($data = fgetcsv($file)) { //每次读取CSV里面的一行内容
if ($i > 0){
$obj = explode(" ", $data[0]);// 以制表符切割内容(一个tab键)
$email = $obj[0];
/*$encode = mb_detect_encoding($obj[0],array("ASCII","UTF-8","GB2312","GBK","BIG5"));
$email = iconv($encode,"UTF-8",$obj[0]);
$encode = mb_detect_encoding($email,array("ASCII","UTF-8","GB2312","GBK","BIG5"));*/
$sql = "insert into EMDA_20140331(email)
values('{$email}')";
$db->exec ( $sql );
}
$i ++;
}
fclose($file);
}
echo "finish!";exit;
直接运行这段代码后,发现mysql中的表有增加记录数,但是email字段全部都没有值。于是打印了运行的sql语句,放到navicat中执行,发现是可以运行的。思前想后的开始以为是$db->exec()封装的方法有问题,于是,直接手写了一个insert的sql。调用封装方法运行,数据库中值存了进去,开始想是不是插入时值有问题。接着又用php的addslashes()函数将插入值编译后再运行,发现还是不行。只好谷歌百度了,看到有人说会不会是字符编码的问题,感觉很像就用字符检查函数尝试对值进行检测。这时,问题果然出现了,mysql里的字符编码是UTF-8,可检测到字段的编码是ASCII。不得不说声坑啊,之后尝试用字符转码函数iconv想将ASCII转成UTF-8,发现转换不了。继续谷歌百度后,发现想转换需要自己写方法,感觉没那个必要(有兴趣的朋友可以继续研究),果断用最原始的方法用记事本打开那个见鬼的data.csv文件,然后另存为UTF-8格式,重新运行程序,数据正常插入一切OK了。
备注:编码检测函数和编码转换函数都在上面的代码内。
另外需要提醒的是,当我们需要将外部的csv数据源导入到数据库中的时候,最好是可以先看下文件的保存编码。