PHP调用含mysql-connector-python的Python脚本时UTF-8字符集报错问题
解决PHP exec()调用含MariaDB连接的Python脚本时的UTF-8字符集错误
核心解决方案
以下是经过验证的可行方案,按优先级尝试:
强制Python数据库连接使用utf8mb4字符集
直接在连接配置中明确指定字符集,避免依赖环境自动检测。修改你的Python连接代码:import mysql.connector db_config = { 'user': '你的用户名', 'password': '你的密码', 'host': '127.0.0.1', 'database': '你的数据库名', 'charset': 'utf8mb4', 'use_unicode': True } conn = mysql.connector.connect(**db_config)这会跳过mysql-connector-python的自动字符集推断,直接使用MariaDB支持的utf8mb4。
在PHP exec()调用时设置正确的字符集环境变量
Web服务器运行PHP时的环境变量和用户CLI环境不一致,导致Python脚本无法获取正确的字符集配置。在调用时显式设置环境变量:// 先设置UTF-8环境变量,再调用Python脚本 exec('export LC_ALL=en_US.UTF-8 && export LANG=en_US.UTF-8 && python3 /path/to/your/script.py', $output, $return_code);确保替换
/path/to/your/script.py为实际脚本路径。替换mysql-connector-python为mysqlclient
mysql-connector-python与MariaDB的兼容性存在偶发问题,改用更成熟的mysqlclient(MySQLdb的分支):
先安装依赖和库:sudo apt-get install python3-dev default-libmysqlclient-dev pip3 install mysqlclient然后修改Python脚本的连接代码:
import MySQLdb conn = MySQLdb.connect( user='你的用户名', password='你的密码', host='127.0.0.1', database='你的数据库名', charset='utf8mb4' )
问题根源解释
- IDE和CLI运行Python时,继承了用户会话的正确字符集环境变量(如
LANG=en_US.UTF-8),mysql-connector-python能正确识别并使用utf8mb4; - PHP通过exec()调用时,Web服务器(Apache/Nginx)的运行环境缺少这些字符集变量,导致mysql-connector-python错误尝试使用MySQL旧版的
utf8(仅支持3字节字符),而MariaDB在配置为utf8mb4后不再兼容该字符集声明; - 降级mysql-connector-python到8.0.29仅修复了CLI环境下的自动检测逻辑,但Web环境的变量缺失仍会触发bug。
额外检查项
- 确认Python脚本开头添加编码声明:
# -*- coding: utf-8 -*- - 验证MariaDB的
my.cnf配置生效,重启服务:[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4 - 检查PHP的
php.ini中设置default_charset = "UTF-8",重启Web服务器
内容的提问来源于stack exchange,提问作者obi
相关产品推荐
相关产品推荐

