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 mysqlimysqli即说明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_clientcharacter_set_connectioncharacter_set_results
完成以上步骤后,PHP即可正常读写MySQL中的Emoji字符。
内容的提问来源于stack exchange,提问作者bynack
相关产品推荐
相关产品推荐

