UTF-8 MySQL and Charset

6

有人能解释一下,当我将所有东西设置为UTF-8时,为什么还是会出现这些烦人的���?

MySQL
服务器版本:5.1.44
MySQL字符集:UTF-8 Unicode(utf8)

我创建了一个新数据库

名称:utf8test
排序规则:utf8_general_ci
MySQL连接排序规则:utf8_general_ci

我的MySQL代码如下:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

CREATE TABLE IF NOT EXISTS `test_table` (
    `test_id` int(11) NOT NULL,
    `test_text` text NOT NULL,
    PRIMARY KEY (`test_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `test_table` (`test_id`, `test_text`) VALUES
(1, 'hééélo'),
(2, 'wööörld');

我的 PHP / HTML:

<?php
$db_conn = mysql_connect("localhost", "root", "") or die("Can't connect to db");
mysql_select_db("utf8test", $db_conn)  or die("Can't select db");

// $result = mysql_query("set names 'utf8'"); // this works... why??
$query = "SELECT * FROM test_table";        
$result = mysql_query($query);

$output = "";
while($row = mysql_fetch_assoc($result)) {
    $output .= "id: " . $row['test_id'] . " - text: " . $row['test_text'] . "<br />";
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="it" xmlns="http://www.w3.org/1999/xhtml" xml:lang="it">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>UTF-8 test</title>
</head>
<body>
<?php echo $output; ?>
</body>
</html>

在数据库上: ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 这将解决“从现在开始”创建的表。不适用于已存在的表。对于它们,您需要执行以下操作: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 来源-https://www.digitalocean.com/community/questions/any-way-to-disable-charset-handshake-and-change-default-server-charset-in-managed-mysql
- lingar
6个回答

6
尝试在 mysql_connect 函数后设置字符编码,如下所示:
 mysql_query ("set character_set_client='utf8'"); 
 mysql_query ("set character_set_results='utf8'"); 

 mysql_query ("set collation_connection='utf8_general_ci'");

1
可以简化为简单的 SET NAMES utf8 - Your Common Sense
是的,我知道。我编写了MySQL 4+解决方案。 - antyrat
4.0 不理解这些设置。而 4.1 则理解设置名称。 - Your Common Sense

1
我会说你忘记将 PHP 文件的内容类型编码设置为 utf-8:
header('Content-Type: text/html; charset=utf-8');

或者 MySQL 数据库中存在编码错误吗?

如果只有加载数据会返回错误结果,您可以使用之前提到的查询语句或这行代码来启用 UTF-8 查询:

$mysqli->set_charset('utf8');

我希望这就是你所需要的。


1

我在连接到您的数据库后没有看到一个"SET NAMES 'utf8';"查询。

尝试一下,可能会对您有帮助。


1
我把所有东西都设置成了UTF-8。
不完全正确。 你必须告诉mysql你的客户端编码。
事实上,你不必将“一切”都设置为utf-8。你可以将表格设置为latin1并输出为utf-8,或者反之亦然。 非常灵活。
但是你必须明确地设置客户端编码。 所以,这就是为什么使用“set names utf8”可以工作的原因。因为这个查询设置了客户端的编码。并让Mysql知道数据必须以utf-8发送。相当合理,对吧?
另外,我还要提到你的SQL转储。它需要相同的设置。只需在顶部的某个位置设置名称即可。因为你也是从某个客户端发送这些查询。而且这个客户端的编码也需要设置。
还有一件事要提醒:请确保你的服务器在Content-type头中发送适当的编码。你也没有将它设置为UTF-8。

谢谢上校。好的,让我看看...你所说的SQL转储...除了我的示例中的 $result = mysql_query("set names 'utf8'") 这一行之外,我还需要做另一个 set names utf8 吗?请问在哪里以及如何添加? - FFish
@FFish,您输入SQL命令的地方是从SET SQL_MODE开始的。这是MySQL控制台还是其他什么?这只是一个简单的规则:每次插入或选择数据时,客户端编码必须设置。 - Your Common Sense

0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接