我意识到有十几个类似的问题,但是在这种情况下,建议的解决方案都没有。
我在页面上有一个 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 中键入西里尔字母字符串时,它起初看起来很好(保存后它会正确显示)。但是重新加载表格,它以十六进制显示,就像插入的表格一样。对于问题中有关此问题的错误信息,我深表歉意。事实证明,这应该意味着问题出在 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