我使用下面的代码将我的MySQL数据导出到.CSV文件中。一切正常,但当我尝试导出这些字母ě, š, č, ř, ž, ý, á, í, é
(捷克语字母)时,字母ě, ř, č
将导出为?
。其他字母输出正常。
<?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 :(得分:7)
由于您未明确设置encoding of the database connection,因此将使用编译libmysql
的默认编码(通常为latin1)。在将结果集转码为该字符集时,MySQL会用?
替换它无法表示的任何字符。
为避免这种情况,您应在打开数据库连接后调用mysql_set_charset('utf8')
- 请参阅UTF-8 all the way through。
那就是说,你根本就不应该使用ext / mysql:它现在已被弃用,并且手册已经包含了警告,反对在新代码中使用它近三年了。请改为考虑MySQLi或PDO。
最后,如果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(&#34;逗号分隔值&#34;);当使用制表符作为字段分隔符时,格式更正确地称为TSV(&#34;制表符分隔值&#34;)并且应该具有.tsv
或.tab
扩展名。
答案 1 :(得分:0)
虽然PHP documentation不推荐,但您可以尝试使用&#34;旧方法&#34;在您选择数据库之后,通过SQL设置连接字符集:SET NAMES utf8;
然后SET CHARACTER SET utf8;
。
注意:这两个陈述的顺序很重要!
编辑#1
我刚刚注意到,在 eggyal 的回答中,唯一的问题是缺少INTO OUTFILE
权限。您应该尝试使用eggyal的第二段中描述的方法,即在选择数据库后立即使用the mysql_set_charset('utf8')
。