PHP中MySQL的UTF-8字符集问题

时间:2012-04-06 17:45:37

标签: php mysql utf-8 include eval

这真的是我的坚果......

所有相关的PHP输出脚本都设置了标题(在这种情况下只有一个文件 - 主要的php脚本):

header("Content-type: text/html; charset=utf-8");

HTML元设置在头部:

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

将所有Mysql表和相关列设置为:

utf8_unicode_ci     Unicode (multilingual), case-insensitive

我一直在编写一个类来进行翻译..当类使用fopen,fputs等写入文件时,一切都很好,正确的字符出现在我的输出文件中(编写为php数组并保存到文件系统为.php或.htm文件.eval()正确地返回.htm文件,就像我想要使用它们时包含.php文件一样。一切都很好。

Prob是我尝试为我的数据库创建翻译条目的时候。我的数据库连接类在初始连接后直接添加了以下行:

 mysql_query("SET NAMES utf8, character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

而不是看到正确的字符,我得到了你期望在数据库中使用错误的字符集的常见问题。例如:

Propriétés

而不是:

propriétés

甚至不让我开始使用俄语,日语等字符!但是,然后使用UTF8不应该使任何单一语言字符集成为问题......

我错过了什么?我知道它不是PHP,因为该网站显示了包含的翻译.php或.htm文件中的正确字符,只有当我处理MySQL数据库时才会遇到这些问题。 PHPMyAdmin显示带有错误字符的条目,因此我假设它在PHP“写入”MySQL时发生。在堆栈上检查了类似的问题,但没有一个答案(所有这些都得到了解决)给了我任何线索......

此外,任何人都有使用include $ filename vs eval(file_get_contents($ filename))对速度差异的想法。

3 个答案:

答案 0 :(得分:1)

以下是确保您能够很好地展示这些字符的所有内容:

/* HTTP charset */
header("Content-Type:text/html; charset=UTF-8");

/* Set MySQL communication encoding */
mysql_set_charset("UTF8");

您还需要将DB编码设置为正确的编码,也需要将每个表的编码和字段的编码设置为

最后但并非最不重要的是,您的php文件的编码也应匹配。

答案 1 :(得分:1)

你说你正在看到“你期望使用错误的字符集的通常情况”。但实际上,这个crud是通过在已经存在的UTF8字符串上使用utf8_encode()来创建的,所以很可能你没有在任何地方使用“错误编码”,但是超过你编码为UTF8的次数。

您可以查看我为解决此类问题所做的库:

https://stackoverflow.com/a/3521340/290221

答案 2 :(得分:0)

mysql中有一个mysql_set_charset('utf8');。在另一个查询的开头运行查询。