【发布时间】:2013-07-07 08:10:36
【问题描述】:
我知道有十几个类似的问题,但其中建议的解决方案都不适用于这种情况。
我在页面上有一个 PHP 变量,初始化为:
$hometeam="Крылья Советов"; //Cyrrilic string
当我在页面上打印出来时,它会正确打印出来。所以echo $hometeam 应该显示字符串Крылья Советов。
header中的content meta标签设置如下:
<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
【问题讨论】:
-
您之前是否进行过类似“SET NAMES 'utf8'”的查询? stackoverflow.com/questions/2159434/set-names-utf8-in-mysql
-
@steven 我没有这样做,不,但现在我的问题仍然存在,所以没有帮助。
-
@jovan 源代码文件的编码是什么?在使用西里尔编码的类似设置中进行测试,我只得到一个空字符串。使用 utf8 一切都按预期进行。
-
@Salem 文件的编码也是UTF-8。
-
@jovan 刚刚为您关于团队的其他问题准备好了答案,可惜您删除了它。