首先說(shuō)明一下,我以前使用PERL,保存文件用DBM數(shù)據(jù)庫(kù),有5萬(wàn)多條記錄,每條記錄有15個(gè)字段,現(xiàn)在想用MYSQL,要把記錄導(dǎo)過(guò)來(lái).
第一步,將所有的DBM記錄導(dǎo)入到了一個(gè)文本文件,每個(gè)字段之間用TAB分開(就是"t"),每條記錄換行結(jié)束.
第二步,將數(shù)據(jù)讀入數(shù)組,并且打開數(shù)據(jù)庫(kù)和定義預(yù)處理,代碼如下:
- <?php
- $dbline=file("g:/allrecord.txt"); //將數(shù)據(jù)庫(kù)記錄讀入到數(shù)組
- $collen=array(8,50,80,20,20,30,3,20,1,1,20,35,35,35,2); #表里面每個(gè)字段的長(zhǎng)度數(shù)值
- $db=new mysqli('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); #預(yù)定義插入記錄
- //
- ?>
數(shù)據(jù)庫(kù)有15個(gè)字段,為了方便導(dǎo)入,已經(jīng)設(shè)定全部類型為CHAR,長(zhǎng)度從1到100不等,具體等同$collen的數(shù)值;并且沒(méi)有任何字段設(shè)置UNIQUE或者PRIMARY KEY,在命令行用INSERT命令插入記錄成功,代碼如下:
- <?php
- foreach($dbline as $line) {
- $rec=explode("t",trim($line));
- //這里反復(fù)測(cè)試過(guò),$rec數(shù)組有15個(gè)值,并且我都把它strval了
- // for($j=0;$j<count($rec);$j++) {
- $rec[$j]=substr($rec[$j],0,$collen[$j]);
- }
- for($i=0;$i<count($rec);$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]); //Vevb.com
- $s->execute();
- }
- $s->close();
- $db->close();
- ?>
經(jīng)過(guò)幾個(gè)小時(shí)的調(diào)試,發(fā)現(xiàn)任何字串超過(guò)字段長(zhǎng)度就不能添加,所以做了如下處理.
1) 先把每個(gè)記錄的每個(gè)字段的長(zhǎng)度進(jìn)行了處理,代碼如下:
- for($j=0;$j<count($rec);$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();
這樣就可以插入記錄了.
目前剩下的問(wèn)題是,任何帶有漢字的記錄,都不能插入(在命令行可以).
查了資料,在命令行alter database crm character set 'gb2312',在腳本查詢前加入$db->query("SET names 'gb2312'")都沒(méi)用,也沒(méi)找到my.ini去改default-character-set=gb2312.
難道php5.5暫時(shí)不支持中文?
MYSQL太多稀奇古怪的提示,解決不了問(wèn)題,所有裝上了SQLITE,在命令行導(dǎo)入文本記錄,發(fā)現(xiàn)了問(wèn)題.
1)某些字段中存在換行符,但是在任何文本編譯器中不換行或者不顯示。這樣會(huì)在導(dǎo)入的時(shí)候,1行變成2行,列參數(shù)自然不對(duì)了。
解決方案:用str_replace($line,char(13));把每行內(nèi)的換行符替換掉,然后把所有記錄存入tmp.txt.
2)再進(jìn)行命令行的導(dǎo)入,代碼如下:
- sqlite3>.import tmp.txt customers
- sqlite3>select count(*) from cusomers;
- 57491
顯示導(dǎo)入成功,可見,批量導(dǎo)入的時(shí)候,一定要處理好那些隱藏的特殊字符,由于時(shí)間關(guān)系,沒(méi)有測(cè)試MYSQL的情況,晚上有空再確認(rèn)一下同樣方案是否可行.
新聞熱點(diǎn)
疑難解答
圖片精選