2011-01-06 46 views
0

我有一个包含utf8_general_ci varchar字段的InnoDB表的MySQL数据库。当我通过PHP(通过PEAR :: MDB2)获取它们并尝试输出它们(通过Smarty)时,我得到了?符号。我想知道如何解决这个问题,这很可能是由PHP引起的。字符编码问题:MySQL 5.0 + PHP 5.2

良好的信息知道:

  • 据该网站的新版本,我的工作,老版本有,即使它并没有使用Smarty的,也不MDB2同样的问题,所以他们是最有可能不是原因。旧程序员使用htmlentities()来解决问题,但我试图避免这种情况。
  • 我所有文件(模板,源代码等)的字符编码都是UTF-8,没有BOM。
  • 当我显示一个页面时,所有重音字符(模板中的那些字符,而不是来自MySQL的)会正确显示,并且浏览器中的编码为UTF-8。如果我手动将其切换到ISO-8859-1,那么MySQL中的字符正确输出,但没有其他字符。

基本上,似乎PHP或MySQL在查询/获取过程中的某个点将数据库中包含的UTF-8数据转换为ISO-8859-1,这就是我想要解决的问题。

我已经做了很多搜索,但没有找到任何解决方案,我希望问题出在某个地方。我想避免使用htmlentities()或utf8_encode(),但这可能是PHP6出现之前唯一的方法。

谢谢你对此的意见!

+0

这些是如何来看?直行 ?标记或?在黑色钻石? – 2011-01-06 15:44:51

回答

1

您需要执行一些查询来告诉它使用UTF-8进行连接(默认值为Latin-1)。下面是我用:

SET CHARACTER SET = "utf8"; 
SET character_set_database = "utf8"; 
SET character_set_connection = "utf8"; 
SET character_set_server = "utf8"; 

我知道有一些这些似乎矫枉过正,但他们已经过测试,似乎工作得很好......

+0

“我不知道这个神奇的咒语是什么意思,但是当我吟唱它时,它总是会在我的庄稼上下雨”。非常聪明 – 2011-01-06 15:41:07

0

我的猜测是当数据到达数据库时数据不是utf-8编码的。