将utf-8字符串插入数据库然后将其输出到网页时出现问题

时间:2010-09-28 09:13:08

标签: php mysql utf-8

我正在学习PHP编程,因此我设置了测试数据库并尝试用它做各种事情。所以情况是这样的:

数据库排序规则是utf8_general_ci。

有查询

创建的表“书籍”
create table books
(  isbn char(13) not null primary key,
   author char(50),
   title char(100),
   price float(4,2)
);

然后它填充了一些样本数据 - 注意文本条目是俄语。此查询保存为utf-8,没有BOM .sql并已执行。

insert into books values
  ("5-8459-0046-8", "Майкл Морган", "Java 2. Руководство разработчика", 34.99),
  ("5-8459-1082-X", "Кристофер Негус", "Linux. Библия пользователя", 24.99),
  ("5-8459-1134-6", "Марина Смолина", "CorelDRAW X3. Самоучитель", 24.99),
  ("5-8459-0426-9", "Родерик Смит", "Сетевые средства Linux", 49.99);

当我通过phpMyAdmin查看创建的表的内容时,我得到了正确的结果。

当我从这个表中检索数据并尝试通过php显示它时,我得到问号而不是俄语符号。这是我的PHP代码:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Books</title>
</head>
<body>
<?php
  header("Content-type: text/html; charset=utf-8");
  mysqli_set_charset('utf8');
  @ $db = new mysqli('localhost', 'login', 'password', 'database');

  $query = "select * from books where ".$searchtype." like '%".$searchterm."%'";
  $result = $db->query($query);
  $num_results = $result->num_rows;

  for ($i = 0; $i < $num_results; $i++) {
     $row = $result->fetch_assoc();
     echo "<p><strong>".($i+1).". Title: ";
     echo htmlspecialchars (stripslashes($row['title']));
     echo "</strong><br />Author: ";
     echo stripslashes($row['author']);
     echo "<br />ISBN: ";
     echo stripslashes($row['isbn']);
     echo "<br />Price: ";
     echo stripslashes($row['price']);
     echo "</p>";
  }
...

这是输出:

1. Название: Java 2. ??????????? ????????????
Автор: ????? ??????
ISBN: 5-8459-0046-8
Цена: 34.99

有人可以指出我做错了吗?

6 个答案:

答案 0 :(得分:2)

  

有人可以指出我做错了吗?

是的,我可以。
你没告诉Mysql服务器,你想要什么数据编码 如果您的页面编码与存储的数据编码不同,Mysql可以提供任何编码。并在飞行中重新编码。
因此,需要告知客户端的首选编码(您的PHP代码是该数据库客户端) 默认情况下,它是latin1。因此,因为latin1字符表中没有这样的符号,所以返回问号。

有两种方法可以告诉mysql我们想要什么编码:

  • 稍微更优选的是 mysqli_set_charset()函数(在您的情况下为方法)。
  • 不太优选的一个是SET NAMES查询。

但只要您正确使用mysqli扩展,并不重要。 (虽然你不是)

请注意,在mysql中,此编码称为utf8,没有短划线或空格。

答案 1 :(得分:1)

  1. 尝试设置输出字符集:

    SET NAMES'utf-8' 设置字符集utf-8

  2. 创建.htaccess文件:

    AddDefaultCharset utf-8 AddCharset utf-8 * CharsetSourceEnc utf-8 CharsetDefault utf-8

  3. 以UTF-8保存文件,无需BOM。

  4. 在html head中设置charset。

答案 2 :(得分:1)

您可能需要在设置与mysqli_set_charset('utf8');的连接后致电new mysqli(...),因为它适用于链接而非全局设置。

所以..

@ $db = new mysqli('localhost', 'login', 'password', 'database');
mysqli_set_charset($db, 'utf8');
$query = "select * from books where ".$searchtype." like '%".$searchterm."%'";

顺便说一下,除非$searchterm被清理,否则该查询似乎对SQL注入开放。请记住一些事项,考虑使用准备好的陈述。

通常不推荐使用@来抑制错误,特别是在开发期间不这样做。更好地处理错误条件。

答案 3 :(得分:1)

在mysql_connect之后,将您的连接设置为UTF-8:

mysql_query("SET NAMES utf8");

按照亚历山大的建议.htaccess,标题和文件编码

答案 4 :(得分:0)

在你的mysql_query add

之后

        @mysql_query("SET character_set_server='utf8'; ");   
    @mysql_query("SET character_set_client='utf8'; ");
    @mysql_query("SET character_set_results='utf8'; ");   
    @mysql_query("SET character_set_connection='utf8'; ");   
    @mysql_query("SET character_set_database='utf8'; ");   
    @mysql_query("SET collation_connection='utf8_general_ci'; ");   
    @mysql_query("SET collation_database='utf8_general_ci'; ");   
    @mysql_query("SET collation_server='utf8_general_ci'; ");

答案 5 :(得分:-2)

尝试在HTML文档中添加元标记:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

这与HTTP标头header("Content-type: text/html; charset=utf-8");

不同