mysqli_get_charset返回错误排序规则,如何修正?
字符集与排序规则配置问题排查与修复
环境与配置说明
- PHP版本:8.1
- MySQL版本:8.0
- 自定义数据库、表、字段排序规则:
utf8mb4_0900_ai_ci - 系统默认库(information_schema、performance_schema)排序规则:
utf8mb3_general_ci
MySQL全局字符集配置(performance_schema.global_variables)
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 utf8mb3 collation_connection utf8mb4_0900_ai_ci collation_database utf8mb4_0900_ai_ci collation_server utf8mb4_0900_ai_ci default_collation_for_utf8mb4 utf8mb4_0900_ai_ci
会话级变量异常(performance_schema.session_variables)
重启MySQL及手动修改后,会话变量仍与全局配置不符:
character_set_client utf8mb4 character_set_connection utf8mb4 character_set_database utf8mb3 character_set_filesystem binary character_set_results utf8mb4 character_set_server utf8mb4 character_set_system utf8mb3 collation_connection utf8mb4_0900_ai_ci collation_database utf8mb3_general_ci collation_server utf8mb4_0900_ai_ci default_collation_for_utf8mb4 utf8mb4_0900_ai_ci
PHP连接代码与输出
$conn = mysqli_connect($hostname, $username, $password, $database); mysqli_set_charset($conn,"utf8mb4"); mysqli_query($conn, "SET collation_connection = 'utf8mb4_0900_ai_ci'"); mysqli_query($conn, "SET SESSION collation_connection = 'utf8mb4_0900_ai_ci'"); var_dump(mysqli_get_charset($conn)); // 输出结果 object(stdClass)#2 (8) { ["charset"]=> string(7) "utf8mb4" ["collation"]=> string(18) "utf8mb4_general_ci" ["dir"]=> string(0) "" ["min_length"]=> int(1) ["max_length"]=> int(4) ["number"]=> int(45) ["state"]=> int(1) ["comment"]=> string(13) "UTF-8 Unicode" }
核心问题
mysqli_get_charset()返回的排序规则为utf8mb4_general_ci,而非预期的utf8mb4_0900_ai_ci。
修复方案
- 换用
SET NAMES绑定字符集与排序规则mysqli_set_charset()仅负责设置字符集,不会同步指定排序规则。直接用SET NAMES语句一次性完成字符集和排序规则的绑定:
$conn = mysqli_connect($hostname, $username, $password, $database); // 替换原有的mysqli_set_charset和单独的SET语句 mysqli_query($conn, "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_0900_ai_ci'"); var_dump(mysqli_get_charset($conn));
这条语句会同时设置character_set_client、character_set_connection、character_set_results以及对应的collation_connection。
- 排查会话
character_set_database异常原因
会话中character_set_database显示utf8mb3,大概率是连接时指定的数据库名称错误,或者数据库创建时未显式指定字符集(即便全局配置为utf8mb4,旧数据库可能继承了历史规则):
- 确认连接参数中的
$database是目标库的正确名称 - 检查目标库的实际配置:
若结果不是SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '你的数据库名';utf8mb4和utf8mb4_0900_ai_ci,执行修改:ALTER DATABASE `你的数据库名` CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
- 修改MySQL配置文件确保持久生效
在my.cnf(Linux)或my.ini(Windows)中添加以下配置,避免重启MySQL后会话变量异常:
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_0900_ai_ci default-collation-for-utf8mb4=utf8mb4_0900_ai_ci [client] default-character-set=utf8mb4
保存后重启MySQL服务,再次检查会话变量是否与全局配置一致。
- 验证最终效果
除了mysqli_get_charset(),还可以通过SQL查询直接验证会话变量:
$result = mysqli_query($conn, "SHOW VARIABLES LIKE 'collation_connection'"); var_dump(mysqli_fetch_assoc($result));
确认返回值为utf8mb4_0900_ai_ci即可。
内容的提问来源于stack exchange,提问作者peppy
相关产品推荐
相关产品推荐

