我知道有很多类似的问题,但是这种情况下没有建议的解决方案适用。
我在页面上有一个PHP变量,初始化为:
$hometeam="Крылья Советов"; //Cyrrilic string
当我将其打印在页面上时,它正确地打印出来了。因此,
echo $hometeam
显示了字符串“Крылья Советов”,正如应该显示的那样。头部中的内容元标记设置如下:
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
而在页面的开头,我有以下内容(根据我搜索到的一个解决方案建议):
ini_set('default_charset', 'utf-8');
应该一切都很好。
我正在尝试将此内容保存到的MySQL表格和列使用utf8_bin作为它们的编码方式。当我在phpMyAdmin中手动输入“Крылья Советов”时,它可以正确地保存在字段中。
但是,当我尝试通过页面上的查询保存它时,使用以下基本查询:
mysql_query("insert into tablename (round,hometeam) values ('1','$hometeam') ");
MySQL的条目看起来像这样:
c390c5a1c391e282acc391e280b9c390c2bbc391c592c391c28f20c390c2a1c390c2bec390c2b2c390c2b5c391e2809ac390c2bec390c2b2
那么这里发生了什么?如果页面上的一切都正常,MySQL本身也没有问题,那么问题出在哪里?我是否需要在查询本身中添加一些内容以使其保持字符串UTF-8编码?
请注意,在连接到数据库后(页面顶部),我已经设置了mysql_set_charset('utf8');
。
编辑:运行查询SHOW VARIABLES LIKE "%character_set%"
会得到以下结果:
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
看起来可能有问题,因为那个列表中有2个latin1。您怎么想?
此外,当我直接在phpMyAdmin中输入Cyrillic字符串时,它一开始看起来很好(保存后它正确地显示)。 但是重新加载表格后,它会像插入的那些一样以HEX形式显示。对于在问题中提供的错误信息,我深感抱歉。实际上,这应该意味着问题出现在phpMyAdmin或数据库本身中。
编辑#2: show create table tablename
返回如下内容:
CREATE TABLE `tablename` ( `id` int(11) NOT NULL AUTO_INCREMENT, `round` int(11), `hometeam` varchar(32) COLLATE utf8_bin NOT NULL, `competition` varchar(32) CHARACTER SET latin1 NOT NULL DEFAULT 'Russia', PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=119 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
print_r
打印$_POST
,那里面的值是否正确? - Jorge Y. C. Rodriguez