首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -> CSV (utf8-BOM报头不能正常工作)

SQL -> CSV (utf8-BOM报头不能正常工作)
EN

Stack Overflow用户
提问于 2014-04-18 11:34:55
回答 2查看 1.7K关注 0票数 1

我使用下面的代码将我的MySQL数据导出到.CSV文件中。所有的工作都很好,但是当我试图输出这些字母ě, š, č, ř, ž, ý, á, í, é (捷克字母)时,ě, ř, č作为?输出。其他信件出口良好。

你能帮我解决这个问题吗?

代码语言:javascript
复制
<?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); 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-23 00:43:56

由于您没有显式地设置数据库连接的编码,所以将使用编译libmysql的默认编码(通常是latin1)。在将结果集转换为该字符集时,MySQL替换它不能用?表示的任何字符。

为了避免这种情况,您应该在打开数据库连接后调用mysql_set_charset('utf8') -请参阅一路走来

尽管如此,您实际上根本不应该使用ext/mysql :它现在已经被废弃了,并且手册中已经包含了关于在新代码中使用ext/mysql的警告已经将近三年了。考虑一下MySQLiPDO

最后,如果MySQL服务器与PHP位于同一台机器上,并且您拥有FILE特权,那么为什么不完全避免将数据交给PHP,而只使用MySQL的SELECT ... INTO OUTFILE命令生成输出文件呢?

代码语言:javascript
复制
//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扩展。

票数 7
EN

Stack Overflow用户

发布于 2014-04-28 14:11:24

虽然PHP文档不建议使用“旧方式”来设置连接字符集,但是在选择数据库之后,您可以尝试通过SQL:SET NAMES utf8;SET CHARACTER SET utf8;设置连接字符集。

注:这两个陈述的顺序很重要!

编辑#1

我刚刚注意到,在茄子的答案中,唯一的问题是缺乏INTO OUTFILE特权。您应该尝试使用茄子第二段中描述的方法,即在选择数据库之后立即使用the mysql_set_charset('utf8')

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23153291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档