用PHP处理MySQL中的utf8mb4数据

用PHP处理MySQL中的utf8mb4数据,php,mysql,cjk,utf8mb4,Php,Mysql,Cjk,Utf8mb4,这可能很简单。我发誓我一直在网上寻找答案,但没有找到。由于我的特殊情况有点非典型,我最终决定在这里提问 我在MySQL中有几个表,我正在用它们来编写一个中文程序。它需要能够支持每一个可能的汉字,包括罕见的没有很好的字体支持的汉字。表中的示例单元格可能是: 東菄鶇䍶 我猜您只是将表设置为utf8mb4,但您的连接编码设置为utf8。您还必须将其设置为utf8mb4,否则MySQL将把存储的utf8mb4数据转换为utf8,后者不能编码“高”Unicode字符。(是的,这是MySQL的特点。) 在原

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

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


東菄鶇䍶 我猜您只是将表设置为
utf8mb4
,但您的连接编码设置为
utf8
。您还必须将其设置为
utf8mb4
,否则MySQL将把存储的
utf8mb4
数据转换为
utf8
,后者不能编码“高”Unicode字符。(是的,这是MySQL的特点。)

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

SET NAMES 'utf8mb4';
SELECT * FROM `my_table`;
您必须根据客户端的最佳方式进行调整,这取决于您如何从PHP(MySQL、mysqli或PDO)连接到MySQL


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


为了补充@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;

希望这对其他人有所帮助。

您正在设置数据库连接编码吗?如果是的话,怎么做,做什么?这些字符是在某个地方转换的,还是只是显示问题?这个字符串上的
bin2hex()
在PHP中提供了什么?我正在从PHP访问,目前正在使用
mb_internal_编码('UTF-8')这会影响解决方案吗?是否存在
mb_内部编码('UTF-8MB4')
?否,
mb_internal_encoding
只设置
mb_
函数的内部编码,与MySQL无关。您将从MySQL获得正常的UTF-8,
utf8mb4
只是MySQL的内部内容。那么如何从PHP中使用集合名称呢?或者我是不是搞错了,应该从phpmyadmin之类的东西中进行设置?请参阅更新。希望现在清楚了。将连接编码设置为
utf8mb4
会使PHP接收UTF-8编码的数据。不要忘记使用
service mysqld start
/etc/init.d/mysqld restart
重新启动mysql。更改配置文件后,为什么会有同名的设置,但带有连字符或下划线,带引号或不带引号?
CREATE TABLE `mysql_table` (
  `mysql_column` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`mysql_column`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;