这可能很简单。我发誓我一直在网上寻找答案但还没找到。由于我的特殊情况有点不典型,我终于决定在这里问。
我在MySQL中有几个用于中文程序的表。它需要能够支持每一个可能的汉字,包括罕见的那些没有很好的字体支持。表中的示例单元格可能是:
東菄鶇䍶倲涷蝀凍鯟崠埬䰤
为了使其在数据库中正常工作,我必须将编码/排序规则设置为utf8mb4。到目前一切尚好。不幸的是,当我将相同的字符串拉到PHP中时,它会被打印如下:
東菄鶇䍶?倲??涷蝀凍鯟?崠埬?䰤
我怎样才能最终去掉剩下的问号,让它们显示为它们应该是的unicode符号呢?我在标记中使用UTF8编码并作为元标记获得了php页面本身。
为什么他们不能互相交流?我做错了什么?
发布于 2012-10-23 14:03:36
我只是猜测您正在将表设置为utf8mb4,但是连接编码设置为utf8。您还必须将其设置为utf8mb4,否则MySQL将将存储的utf8mb4数据转换为utf8,后者不能编码“高”Unicode字符。(是的,这是MySQL的一种特质。)
在原始MySQL连接上,它必须如下所示:
SET NAMES 'utf8mb4';
SELECT * FROM `my_table`;根据从PHP连接到MySQL的方式(mysql、mysqli或PDO),您必须将其调整为客户端的最佳方式。
要真正澄清(是的,为了简单起见,使用mysql_扩展,不要在家里这样做):
mysql_connect(...);
mysql_select_db(...);
mysql_set_charset('utf8mb4'); // adapt to your mysql connector of choice
$r = mysql_query('SELECT * FROM `my_table`');
var_dump(mysql_fetch_assoc($r)); // data will be UTF8 encoded发布于 2016-10-17 06:37:33
为了补充@deceze的答案,我推荐一台配置良好的MySQL服务器(对我来说,在/etc/mysql/mysql.conf.d/mysqld.cnf中)。下面是确保您使用utfmb4的配置选项,尽管我确实建议查看每个MySQL配置选项,尽管这是令人望而生畏的,但是有许多缺省值是非常不理想的。
[client]
default-character-set = utf8mb4
[mysql]
default_character_set = utf8mb4
[mysqld]
init-connect = "SET NAMES utf8mb4"
character-set-client-handshake = FALSE
character-set-server = "utf8mb4"
collation-server = "utf8mb4_unicode_ci"
autocommit = 1
block_encryption_mode = "aes-256-cbc"最后一个应该是默认的。而且,init-connect处理的是不必每次都执行此操作。保持代码干净。现在运行:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';您应该返回如下内容:
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+看起来您已经在这样做了,但是显式地定义表创建并不会有什么害处:
CREATE TABLE `mysql_table` (
`mysql_column` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`mysql_column`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;希望这能帮上忙。
https://stackoverflow.com/questions/13028537
复制相似问题