mysql 导入dbm文件_DBM数据导入到mysql数据库方法

本文介绍了如何将DBM数据导入到MySQL数据库,重点解决了字段长度限制和中文字符导入失败的问题。通过处理每个字段长度、替换隐藏的换行符并调整数据库字符集,最终成功将数据导入SQLite,预计相同方法适用于MySQL。
摘要由CSDN通过智能技术生成

本文章分享一篇关于DBM数据导入到mysql数据库方法,有需要的同学可以参考一下本实例。

首先说明一下,我以前使用PERL,保存文件 用DBM,有5万多条记录,每条记录有15个字段。现在想用MYSQL,要吧记录导过来。

第一步,将所有的DBM记录导入到了一个文本文件,每个字段之间用TAB分开(就是"t"),每条记录换行结束。

第二部,将数据读入数组,并且打开数据库和定义预处理如下:

代码如下

复制代码

$dbline=file("g:/allrecord.txt"); //将数据库记录读入到数组

$collen=array(8,50,80,20,20,30,3,20,1,1,20,35,35,35,2); #表里面每个字段的长度数值

$db=new i('localhost','me','mypass','allrecdb');

if(mysqli_connect_errno()) {

echo "Can not connect db!";

exit;

}

$q->query("SET names 'gb2312'");

$q="INSERT INTO customers VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

$s=$db->prepare($q); #预定义插入记录

//

数据库有15个字段,为了方便导入,已经设定全部类型为CHAR,长度从1到100不等,具体等同$collen的数值;

并且没有任何字段设置UNIQUE或者PRIMARY KEY;

在命令行用INSERT命令插入记录成功

//

代码如下

复制代码

foreach($dbline as $line) {

$rec=("t",trim($line));

//这里反复测试过,$rec数组有15个值,并且我都把它strval了

// for($j=0;$j

$rec[$j]=substr($rec[$j],0,$collen[$j]);

}

for($i=0;$i

$rec[$i]=strval($rec[$i]);

}

$s->bind_param("sssssssssssssss",$rec[0],$rec[1],$rec[2],$rec[3],$rec[4],$rec[5],$rec[6],$rec[7],$rec[8],$rec[9],$rec[10],$rec[11],$rec[12],$rec[13],$rec[14]);

$s->execute();

}

$s->close();

$db->close();

?>

经过几个小时的调试,发现任何字串超过字段长度就不能添加,所以做了如下处理。

1) 先把每个记录的每个字段的长度进行了处理,代码如下:

代码如下

复制代码

for($j=0;$j

$rec[$j]=substr($rec[$j],0,$collen[$j]);

}

2)再处理插入

代码如下

复制代码

$s->bind_param("sssssssssssssss",$rec[0],$rec[1],$rec[2],$rec[3],$rec[4],$rec[5],$rec[6],$rec[7],$rec[8],$rec[9],$rec[10],$rec[11],$rec[12],$rec[13],$rec[14]);

$s->execute();

这样就可以插入记录了。

目前剩下的问题是,任何带有汉字的记录,都不能插入(在命令行可以)。

查了资料,在命令行alter database crm character set 'gb2312',在脚本查询前加入$db->query("SET names 'gb2312'")

都没用。

也没找到my.ini去改default-character-set=gb2312

难道php5.5暂时不支持中文?

MYSQL太多稀奇古怪的提示,解决不了问题,所有装上了SQLITE,在命令行导入文本记录,发现了问题:

1)某些字段中存在换行符,但是在任何文本编译器中不换行或者不显示。这样会在导入的时候,1行变成2行,列参数自然不对了。

解决方案: 用str_replace($line,char(13));把每行内的换行符替换掉,然后把所有记录存入tmp.txt

2)再进行命令行的导入

代码如下

复制代码

sqlite3>.import tmp.txt customers

sqlite3> count(*) from cusomers;

57491

显示导入成功。

可见,批量导入的时候,一定要处理好那些隐藏的特殊字符。

由于时间关系,没有测试MYSQL的情况。晚上有空再确认一下同样方案是否可行。

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值