You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP无法读写MySQL数据库中Emoji字符问题求助

解决PHP 8.1无法读写MySQL utf8mb4 Emoji字符的问题

核心问题分析

虽然数据库字段已设为utf8mb4编码,但PHP连接MySQL时未指定对应字符集,或mysqli扩展未使用基于mysqlnd的版本(即nd_mysqli),导致字符转码异常,出现写入报错、读取乱码的情况。

步骤1:切换并启用nd_mysqli扩展(Ubuntu 22.04)

Ubuntu 22.04的PHP 8.1默认提供的php8.1-mysql包就是基于mysqlnd驱动的nd_mysqli扩展,只需确保正确安装并启用:

  • 安装扩展:
    sudo apt update && sudo apt install php8.1-mysql
    
  • 验证扩展状态:
    php -m | grep mysqli
    
    输出中出现mysqli即说明nd_mysqli已启用(PHP 8.x中mysqli默认绑定mysqlnd驱动)。

步骤2:强制PHP连接时使用utf8mb4编码

无论使用mysqli还是PDO,必须在连接数据库时明确指定utf8mb4字符集:

对于mysqli函数:

$conn = mysqli_connect('数据库地址', '用户名', '密码', '数据库名');
// 连接成功后立即设置字符集
if ($conn) {
    mysqli_set_charset($conn, 'utf8mb4');
}

对于PDO:

$dsn = 'mysql:host=数据库地址;dbname=数据库名;charset=utf8mb4';
$pdo = new PDO($dsn, '用户名', '密码', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

步骤3:配置php.ini确保全局字符集正确

编辑PHP配置文件(路径通常为/etc/php/8.1/fpm/php.ini或/etc/php/8.1/apache2/php.ini,依运行环境而定):

default_charset = "UTF-8"
mysqli.default_charset = "utf8mb4"

修改后重启服务:

  • 若用PHP-FPM:
    sudo systemctl restart php8.1-fpm
    
  • 若用Apache:
    sudo systemctl restart apache2
    

步骤4:验证连接字符集

连接数据库后执行以下SQL查询,确认字符集配置生效:

SHOW VARIABLES LIKE 'character_set%';

需确保以下三个参数值均为utf8mb4:

  • character_set_client
  • character_set_connection
  • character_set_results

完成以上步骤后,PHP即可正常读写MySQL中的Emoji字符。

内容的提问来源于stack exchange,提问作者bynack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:09:55