2011-08-22 169 views
4

我希望MySQL中的所有数据都是UTF8编码。我已经将所有的字符集和归类设置为数据库,表和列的UTF8。在将任何内容写入数据库之前,我使用PHP中的mb_detect_encoding来检查它是否为UTF8。因此,我相信所有的数据都是UTF8编码的。MySQL UTF8数据没有正确显示

但是,这里有个问题:将这个单词Ríkarðsdóttir从数据库中查询出来并通过PHP在UTF8编码的网页上显示时显示正确。如果我通过phpMyAdmin查询这个相同的记录,我得到RâkarÃsdóttir。如果我使用MySQL命令行也是如此。

Running SHOW VARIABLES returns to me: 
character_set_client utf8, 
character_set_connection utf8, 
character_set_database utf8, 
character_set_filesystem binary, 
character_set_results utf8, 
character_set_server latin1, 
character_set_system utf8 

只有服务器是latin1,我在一个共享的托管站点,不相信我可以改变这一点。这可能是问题吗?

以下是我不明白的:为什么我的UTF8网页正确显示Ríkarðsdóttir,但UTF8编码的phpMyAdmin网页显示它为Räkarðsdóttir?数据不是真正的UTF8编码还是数据库不相信它?需要做些什么来纠正这一点?

回答

3

尝试运行此查询您连接之后:

SET NAMES UTF8 

你的数据库需要存储数据的UTF8,和你的网页标题也应该有一个UTF8声明,但你的数据库连接也需要使用UTF8。您可以在命令行和/或通过PHPMyAdmin运行它。那个“查询”之后的所有通信都将被UTF8编码。

+1

感谢您的建议;但是,它没有解决问题。我通过mysql shell尝试了SET NAMES的'utf8'查询,并将它添加到phpMyAdmin中,但在任何情况下都不会影响数据的显示。 根据mysql文档:http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html,SET NAMES'x'语句等同于以下三条语句: SET character_set_client = x ; SET character_set_results = x; SET character_set_connection = x 根据SHOW VARIABLES查询,它们都设置为UTF8。不知何故,似乎mysql似乎正在以某种其他编码(latin1)存储UTF8数据。 – jkharlan

+0

您可以尝试运行ALTER TABLE表名CONVERT TO CHARACTER SET utf8以确保数据以UTF8存储。 –