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

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。

修复方案

  1. 换用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。

  1. 排查会话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;
    
  1. 修改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服务,再次检查会话变量是否与全局配置一致。

  1. 验证最终效果
    除了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:47:18