将csv导入mySQL db时出现西里尔语编码问题

时间:2016-01-06 12:47:12

标签: php mysql csv encoding utf-8

我遇到了以下问题:我已经导入了一个包含Cyrillic记录的csv文件,使用HeidiSQL数据库浏览器完成了该操作。我用记事本打开.csv并将编码更改为utf-8,然后使用phpmyadmin创建数据库,并将collat​​ion设置为UTF-8_general_ci。

HeidiSQL import settings

导入我选择的UTF-8编码后,在导入后HeidiSQL和phpmyadmin中的一切看起来都很好,我的意思是一切都是可读的,但在我的index.php文件中也不可读,其中编码设置为utf -8通过 header('Content-Type: text/html; charset=utf-8'); Browser output 我不知道我的错误在哪里。

这是我的index.php代码:

<?php header('Content-Type: text/html; charset=utf-8');?>
<?php include 'config.php'; ?>
<?php include 'header.php';?>


<?php
$db=new mysqli("$dbhost","$dbuser","$dbpass");
$db->select_db("$dbname") or die ("Critical error: Could not connect to database!");
$query="select * from books";
$result=$db->query($query);

//find number of rows
$num_rows=$result->num_rows;

mysql_query('SET NAMES utf8');
?>



<div id="box">
<center>

<form id="search" action="index.php" method="post">
    <input type="text" name="search" placeholder"Search your book..."/>
    <input type="submit" value="Search"/>
</form>
<br>
<h3>Our Books</h3>
<table border="1">
<tr id="table_header">
<td>Author</td>
<td>Title</td>
<td>Publisher</td>
<td>Year</td>
<td>Edition</td>
<td>Location</td>
<td>Holder</td>
<td>ISBN</td>
</tr>



<?php
$total=0;
$tstoke=0;
$tout=0;
for($i=0;$i<$num_rows;$i++)
{
    //fetch  row
    $row=$result->fetch_row();
    $total=$total+$row[2];
    echo "<tr>";
    echo "<td width=\"150\">$row[1]</td>" ; 
    echo "<td width=\"250\">$row[2]</td>" ;
    echo "<td width=\"100\">$row[3]</td>" ;
    echo "<td width=\"30\">$row[4]</td>" ;
    echo "<td width=\"30\">$row[5]</td>" ;
    echo "<td width=\"30\">$row[6]</td>" ;
    echo "<td width=\"100\">$row[7]</td>" ;
    echo "<td width=\"30\">$row[8]</td>" ;
    $stoke=$row[2]-$row[3];
    $tstoke=$tstoke+$stoke;
    $tout=$total-$tstoke;
    echo "<td width=\"30\">$stoke</td>" ;
    echo "</tr>";
}   
echo "</table>";    
?>
</center><br>
<center>Now We Have : <?php echo $num_rows; ?> Defreent Books >> Total Books : <?php echo $total; ?> >> Total Stoke : <?php echo $tstoke; ?> >> Total Out : <?php echo $tout; ?></center>
<br>
</div>
<?php include 'footer.php'; ?>
</center>

2 个答案:

答案 0 :(得分:0)

我之前遇到过这个问题并找到了一个解决方案:

mysqli_set_charset($db,'utf8');

并且每当打印数据库值时都必须使用htmlentities

即。你的更新for循环是

echo "<table>";
for($i=0;$i<$num_rows;$i++)
{
    //fetch  row
    $row=$result->fetch_row();
    $total=$total+$row[2];
    echo "<tr>";
    echo "<td width=\"150\">htmlentities($row[1]);</td>" ; 
    echo "<td width=\"250\">htmlentities($row[2]);</td>" ;
    echo "<td width=\"100\">htmlentities($row[3]);</td>" ;
    echo "<td width=\"30\">htmlentities($row[4]);</td>" ;
    echo "<td width=\"30\">htmlentities($row[5]);</td>" ;
    echo "<td width=\"30\">htmlentities($row[6]);</td>" ;
    echo "<td width=\"100\">htmlentities($row[7]);</td>" ;
    echo "<td width=\"30\">htmlentities($row[8]);</td>" ;
    $stoke=$row[2]-$row[3];
    $tstoke=$tstoke+$stoke;
    $tout=$total-$tstoke;
    echo "<td width=\"30\">$stoke</td>" ;
    echo "</tr>";
}   
echo "</table>";    

让我告诉你一件事,你必须通过这个函数设置你的字符集,以便它将用于你当前的数据库连接。

标题适用于您的网页,不适用于您的数据库。

希望这能解决您的问题。

答案 1 :(得分:0)

请勿使用mix mysql_*mysqli_*接口!

需要在大约4个地方建立utf8。

  • 数据库中的列 - 使用SHOW CREATE TABLE验证它们是显式设置为utf8还是默认为表定义。 (仅更改数据库默认是不够的。)
  • 客户端和服务器之间的连接。请参阅SET NAMES utf8
  • 您拥有的字节数。 (情况可能就是这样。)
  • 如果要在网页中显示文字,请检查<meta>标记。

可能发生的事情:

  • 你有utf8编码的数据(好)
  • SET NAMES latin1生效(默认,但错误)
  • 该列已声明CHARACTER SET latin1(默认,但错误)

注意:mysql_query('SET NAMES utf8');无效,因为您的连接是通过mysqli_*界面进行的。