2012-07-23 69 views
1

我有一個.csv文件,我需要上傳到數據庫。已經有一個現有的PHP腳本,它解析這些數據並將其插入到多個數據庫表中,並且這一直工作正常。最新的csv文件給我錯誤。Mysql - php上傳數據 - 錯誤 - 1366錯誤的字符串值

我無法讓自己解決這個問題。這是簡單的英文文本,沒有特殊字符,但我不斷收到某些行的錯誤。

這是一個這樣的行

 
It is an investment strategy that aims to balance risk and reward 

的示例這是錯誤我得到在上傳

 
ERROR=1366-Incorrect string value: '\xA0strat...' for column 'question' at row 1 

表字符集是UTF-8和列的問題是類型TEXT

我正在Windows命令提示符下運行PHP腳本 - 我有一種感覺,它與此有關。但在以前的所有場合,對於其他CSV文件 - php腳本在Windows本身上運行。

現在,當我在記事本中鍵入上述英文文本並將其插入到CSV文件 - 它工作正常 - 但我有超過500行是給這個錯誤,我不能繼續在記事本中鍵入每行,然後粘貼它CSV。

*** 編輯 ** * ** * *** 這是錯誤代碼生成

 
foreach($question_array as $question) 
{ 
    //INSERT QUESTION table 
    mysql_query("INSERT INTO adl_question (question) VALUES ('".$question."')",$con); 
    echo 'ERROR='.mysql_errno($con).'-'.mysql_error($con); 
    $question_id = mysql_insert_id(); 
} 

任何見解 感謝

+1

請提供一些代碼 – Ron 2012-07-23 14:18:31

+0

它看起來像文件不是以UTF-8編碼。字節'0xA0'(可能意圖表示[U + 00A0](http://www.fileformat.info/info/unicode/char/a0/index。htm),一個非中斷空間)導致無效的UTF-8編碼(U + 00A0以UTF-8編碼爲0xC2A0)。 – eggyal 2012-07-23 14:25:02

+0

@Ron - 我將添加一些代碼 - 但它的標準插入查詢在php – Gublooo 2012-07-23 14:26:25

回答

3

我在處理數據時遇到了這個問題rsion最近。你需要做的是使用iconv作爲WINDOWS-1250(或任何編碼'壞'文本的字符)顯式讀取它,然後轉換回UTF-8。

<?php 
$string = iconv('windows-1250', 'utf-8', $badString); 
?> 

查看http://us3.php.net/manual/en/function.iconv.php瞭解更多信息。

如果您需要爲整個文件做到這一點,您可以使用此功能(我沒有寫):

<?php 
function utf8_fopen_read($fileName) { 
    $fc = iconv('windows-1250', 'utf-8', file_get_contents($fileName)); 
    $handle=fopen("php://memory", "rw"); 
    fwrite($handle, $fc); 
    fseek($handle, 0); 
    return $handle; 
} 
?> 

,然後實現它作爲這樣:

<?php 
if (($handle = utf8_fopen_read("mycsv.csv")) !== FALSE) { 

    while($file = fgetcsv($handle)) { 
     $csv[] = $file; 
    } 

    foreach($csv as $row) { 
     // run insert here 
    } 
} 
?> 
+0

而不是做所有這些,可以通過'CHARACTER SET'子句將文件的編碼通知MySQL到['LOAD DATA'](http://dev.mysql.com/doc/en/load -data.html)命令:例如'LOAD DATA INFILE'/path/to/mycsv.csv'INTO TABLE adl_question CHARACTER SET latin1 ...' – eggyal 2012-07-23 14:45:06

+0

我個人不會相信MySQL來處理數據轉換,但是你的解決方案可能會工作。不過,我認爲他在插入數據之前試圖格式化數據,所以它可能是一個毫無意義的問題...... – Brendan 2012-07-23 14:49:19

+0

MySQL只是使用libiconv本身,所以我不明白爲什麼它應該不那麼可靠。如果有的話,通常使用已經存在的工具比嘗試自己的工具更好。此外,'LOAD DATA'顯着([手冊說明](http://dev.mysql.com/doc/en/insert-speed.html)大約20倍)比爲每行調用一條INSERT語句快得多。 – eggyal 2012-07-23 14:51:44

0

的錯誤字符串表示文本中有非ASCII字符。例如,char \ xA0將在大多數編輯器中顯示爲空白區域,但不在ascii範圍內。在你的例子中,在「策略」這個詞之前必須有一個字符。

一個好的十六進制編輯器會告訴你字符在你的字符串中究竟是什麼。我使用記事本++來查看麻煩的文本,並且您必須啓用特殊字符查看。