我正在学习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
有人可以指出我做错了吗?
答案 0 :(得分:2)
有人可以指出我做错了吗?
是的,我可以。
你没告诉Mysql服务器,你想要什么数据编码
如果您的页面编码与存储的数据编码不同,Mysql可以提供任何编码。并在飞行中重新编码。
因此,需要告知客户端的首选编码(您的PHP代码是该数据库客户端)
默认情况下,它是latin1
。因此,因为latin1字符表中没有这样的符号,所以返回问号。
有两种方法可以告诉mysql我们想要什么编码:
SET NAMES
查询。 但只要您正确使用mysqli扩展,并不重要。 (虽然你不是)
请注意,在mysql中,此编码称为utf8
,没有短划线或空格。
答案 1 :(得分:1)
尝试设置输出字符集:
SET NAMES'utf-8'
设置字符集utf-8
创建.htaccess
文件:
AddDefaultCharset utf-8 AddCharset utf-8 * CharsetSourceEnc utf-8 CharsetDefault utf-8
以UTF-8保存文件,无需BOM。
答案 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("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");