首先說明一下,我以前使用PERL,儲存檔案 用DBM資料庫,有5萬多條記錄,每條記錄有15個欄位。現在想用MYSQL,要吧記錄導過來。
第一步,將所有的DBM記錄匯入到了一個文字檔,每個欄位之間用TAB分開(就是"t"),每條記錄換行結束。
第二部,將資料讀入數組,並且開啟資料庫和定義預先處理如下:
| 代碼如下 |
複製代碼 |
<?php $dbline=file("g:/allrecord.txt"); //將資料庫記錄讀入到數組 $collen=array(8,50,80,20,20,30,3,20,1,1,20,35,35,35,2); #表裡面每個欄位的長度數值 $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); #預定義插入記錄 // |
資料庫有15個欄位,為了方便匯入,已經設定全部類型為CHAR,長度從1到100不等,具體等同$collen的數值;
並且沒有任何欄位設定UNIQUE或者PRIMARY KEY;
在命令列用INSERT命令插入記錄成功
//
| 代碼如下 |
複製代碼 |
foreach($dbline as $line) { $rec=explode("t",trim($line)); //這裡反覆測試過,$rec數組有15個值,並且我都把它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]); $s->execute(); } $s->close(); $db->close(); ?> |
經過幾個小時的調試,發現任何字串超過欄位長度就不能添加,所以做了如下處理。
1) 先把每個記錄的每個欄位的長度進行了處理,代碼如下:
| 代碼如下 |
複製代碼 |
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();
這樣就可以插入記錄了。
目前剩下的問題是,任何帶有漢字的記錄,都不能插入(在命令列可以)。
查了資料,在命令列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>select count(*) from cusomers;
|
57491
顯示匯入成功。
可見,大量匯入的時候,一定要處理好那些隱藏的特殊字元。
由於時間關係,沒有測試MYSQL的情況。晚上有空再確認一下同樣方案是否可行。