首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PHP处理来自utf8mb4的MySQL数据

问用PHP处理来自utf8mb4的MySQL数据
EN

Stack Overflow用户
提问于 2012-10-23 10:36:17
回答 2查看 12K关注 0票数 7

这可能很简单。我发誓我一直在网上寻找答案但还没找到。由于我的特殊情况有点不典型,我终于决定在这里问。

我在MySQL中有几个用于中文程序的表。它需要能够支持每一个可能的汉字,包括罕见的那些没有很好的字体支持。表中的示例单元格可能是:

東菄鶇䍶倲涷蝀凍鯟崠埬䰤

为了使其在数据库中正常工作,我必须将编码/排序规则设置为utf8mb4。到目前一切尚好。不幸的是,当我将相同的字符串拉到PHP中时,它会被打印如下:

東菄鶇䍶?倲??涷蝀凍鯟?崠埬?䰤

我怎样才能最终去掉剩下的问号,让它们显示为它们应该是的unicode符号呢?我在标记中使用UTF8编码并作为元标记获得了php页面本身。

为什么他们不能互相交流?我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-23 14:03:36

我只是猜测您正在将表设置为utf8mb4,但是连接编码设置为utf8。您还必须将其设置为utf8mb4,否则MySQL将将存储的utf8mb4数据转换为utf8,后者不能编码“高”Unicode字符。(是的,这是MySQL的一种特质。)

在原始MySQL连接上,它必须如下所示:

代码语言:javascript
复制
SET NAMES 'utf8mb4';
SELECT * FROM `my_table`;

根据从PHP连接到MySQL的方式(mysql、mysqli或PDO),您必须将其调整为客户端的最佳方式。

要真正澄清(是的,为了简单起见,使用mysql_扩展,不要在家里这样做):

代码语言:javascript
复制
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
票数 16
EN

Stack Overflow用户

发布于 2016-10-17 06:37:33

为了补充@deceze的答案,我推荐一台配置良好的MySQL服务器(对我来说,在/etc/mysql/mysql.conf.d/mysqld.cnf中)。下面是确保您使用utfmb4的配置选项,尽管我确实建议查看每个MySQL配置选项,尽管这是令人望而生畏的,但是有许多缺省值是非常不理想的。

代码语言:javascript
复制
[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处理的是不必每次都执行此操作。保持代码干净。现在运行:

代码语言:javascript
复制
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

您应该返回如下内容:

代码语言:javascript
复制
+--------------------------+--------------------+
| 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 |
+--------------------------+--------------------+

看起来您已经在这样做了,但是显式地定义表创建并不会有什么害处:

代码语言:javascript
复制
CREATE TABLE `mysql_table` (
  `mysql_column` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`mysql_column`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;

希望这能帮上忙。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13028537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档