2014-04-18 120 views
1

我正在使用下面的代碼將我的MySQL數據導出到.CSV文件中。所有工作正常,但是當我試圖導出這些字母ě, š, č, ř, ž, ý, á, í, é(捷克字母)時,字母ě, ř, č導出爲?。其他字母可以正常導出。SQL - > CSV(utf8-BOM頭部無法正常工作)

請問您能幫我解決這個問題嗎?

<?php 
/*******EDIT LINES 3-8*******/ 
$DB_Server = "xxx";       //MySQL Server  
$DB_Username = "xxx";       //MySQL Username  
$DB_Password = "xxx";       //MySQL Password  
$DB_DBName = "xxx";       //MySQL Database Name 
$DB_TBLName = "wp_comments";       //MySQL Table Name 
$DB_Query  = "comment_author, comment_content";  //MySQL Query (what to select from db, you can use * for all) 
$filename  = "excelfilename";       //File Name 
$filename_columns = array("Autor", "Content");   //File Name of columns 
/*******YOU DO NOT NEED TO EDIT ANYTHING BELOW THIS LINE*******/ 

//headers 
header('Pragma: public'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Content-Description: File Transfer'); 
header('Content-Encoding: UTF-8'); 
header('Content-Type: text/csv; charset=UTF-8'); 
header('Content-Disposition: attachment; filename='.$filename.'.csv;'); 
header('Content-Transfer-Encoding: binary'); 

//create MySQL connection 
mysql_connect($DB_Server,$DB_Username,$DB_Password); 
mysql_select_db($DB_DBName); 
$sql = "SELECT $DB_Query FROM $DB_TBLName"; 
$result = mysql_query($sql); 

$fh = fopen('php://output', 'w'); 
$fp = fwrite($fh, $bom =(chr(0xEF) . chr(0xBB) . chr(0xBF))); // Write UTF-8 BOM 
if($fp) 
{ 
    fwrite($fh, "sep=\t" . PHP_EOL); // Hint for MS Excel 
    while($row = mysql_fetch_row($result)) { 
     fputcsv($fh, $row, "\t"); 
    } 
} 
fclose($fh); 
+0

嘗試使用此問題中的類將所有字符串轉換爲utf-8。 http://stackoverflow.com/questions/23140358/php-glob-directory-utf8/23140525#23140525 –

+0

不工作在男人:/ – pes502

+0

@eggyal是的我相信,這裏有一些截圖:[數據庫內容](http ://i.imgur.com/zlx2vLc.png)和[導出數據庫內容](http://i.imgur.com/zWCit3A.png) – pes502

回答

7

既然你沒有明確設置encoding of the database connection,將用於與該libmysql編譯默認的編碼(通常是LATIN1)。在將結果集轉碼爲該字符集時,MySQL會用?替換它無法表示的任何字符。

爲避免這種情況,您應在打開數據庫連接—後參見UTF-8 all the way through後調用mysql_set_charset('utf8')。這就是說,你真的不應該使用ext/mysql:它現在已經被棄用了,並且手冊已經包含了警告,反對它在近三年的新代碼中的使用。改爲考慮MySQLiPDO。最後,如果MySQL服務器與PHP在同一臺計算機上,並且具有FILE特權,爲什麼不避免將數據完全交給PHP,並且只需使用MySQL的SELECT ... INTO OUTFILE命令生成輸出文件?

//create MySQL connection 
$DB_DSN = "mysql:host=$DB_Server;dbname=$DB_DBName;charset=utf8"; 
new PDO($DB_DSN, $DB_Username, $DB_Password)->exec(" 
    SELECT $DB_Query 
    INTO OUTFILE '/tmp/$filename.tsv' 
    CHARACTER SET utf8 
    FROM $DB_TBLName 
"); 

echo "\xef\xbb\xbf"  // Write UTF-8 BOM 
    , "sep=\t", PHP_EOL; // Hint for MS Excel 

readfile("/tmp/$filename.tsv"); 

請注意,您可能需要確保臨時文件未被併發進程使用。

PS:當字段分隔符是逗號字符時,格式僅被稱爲CSV(「逗號分隔值」);當使用製表符作爲字段分隔符時,格式更正確地稱爲TSV(「製表符分隔值」),並且應具有.tsv.tab擴展名。

+0

我無法在我的虛擬主機中使用此解決方案'INTO OUTFILE' – pes502

+0

@ pes502 :上述答案提供的不僅僅是這一種解決方案。第二段特別解釋瞭如何解決當前的問題。 – eggyal

0

雖然PHP documentation不推薦使用,但您可以嘗試使用「舊方法」通過SQL設置連接字符集:SET NAMES utf8;,然後SET CHARACTER SET utf8;在您選擇數據庫之後。

注意:這兩個語句的順序很重要!

編輯#1

我剛剛注意到,在eggyal的回答你唯一的問題是缺乏INTO OUTFILE特權。您應該嘗試使用在eggyal的第二段中描述的方法,即在選擇數據庫之後使用the mysql_set_charset('utf8')