解决PDO报错:无法从utf8mb3_general_ci转换为utf8mb4_general_ci
解决UTF8MB3到UTF8MB4排序规则转换异常问题
错误信息
Uncaught PDOException: SQLSTATE[HY000]: General error: 3988 Conversion from collation utf8mb3_general_ci into utf8mb4_general_ci impossible for parameter
问题原因
你的数据库表使用utf8mb4字符集(对应排序规则utf8mb4_general_ci),但PDO连接初始化时设置的是SET NAMES utf8——MySQL中的utf8实际是utf8mb3(仅支持最多3字节的Unicode字符),二者字符集/排序规则不匹配,导致参数传递时无法完成转换,抛出异常。
解决方案
1. 修改PDO连接的字符集配置
将连接初始化命令中的utf8替换为utf8mb4,并指定匹配的排序规则,确保连接字符集和表一致:
try { $pdo = new PDO($db_config, $config['db_user'], $config['db_password'], [ PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_general_ci" ]); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); } catch (PDOException $e) { exit("Impossibile connettersi al database: " . $e->getMessage()); }
或者使用PDO专门的字符集属性,写法更规范:
try { $pdo = new PDO($db_config, $config['db_user'], $config['db_password'], [ PDO::MYSQL_ATTR_CHARSET_NAME => 'utf8mb4', PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4" ]); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); } catch (PDOException $e) { exit("Impossibile connettersi al database: " . $e->getMessage()); }
2. 验证连接字符集
执行以下SQL语句,确认连接的字符集和排序规则已正确设置:
SHOW VARIABLES LIKE 'character_set_connection'; SHOW VARIABLES LIKE 'collation_connection';
预期结果应为:
character_set_connection:utf8mb4collation_connection:utf8mb4_general_ci
3. 额外检查
- 确保PHP代码中处理的评论内容本身是UTF-8编码,避免因输入字符串编码不一致引发新的问题。
- 若数据库中存在旧的
utf8mb3数据,可通过ALTER TABLE语句将表/字段统一转为utf8mb4(你的表已经是utf8mb4,此步骤可跳过)。
内容的提问来源于stack exchange,提问作者Leonardo Rosati
相关产品推荐
相关产品推荐

