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