当前位置: 首页> 最新文章列表> mysqli::get_charset 和 MySQL CLI 中 SHOW VARIABLES LIKE 'character_set_%' 的对比

mysqli::get_charset 和 MySQL CLI 中 SHOW VARIABLES LIKE 'character_set_%' 的对比

M66 2025-06-02

在使用 PHP 操作 MySQL 数据库时,我们经常需要关注字符集设置,尤其是当涉及中文或其他多字节字符时。字符集设置不当,可能会导致乱码或数据存储错误。对于字符集,PHP 的 mysqli 扩展提供了 mysqli::get_charset 函数,而在 MySQL 命令行工具(CLI)中,我们通常使用 SHOW VARIABLES LIKE 'character_set_%' 查看相关变量。

本文将深入分析这两者的区别,帮助开发者理解它们的用途和差异。

1?? mysqli::get_charset 是什么?

mysqli::get_charset() 是 PHP 中 mysqli 对象的一个方法,用于获取当前连接的字符集信息。
它返回一个对象,包含如下属性:

  • charset:当前连接的字符集名,例如 utf8mb4

  • collation:排序规则,例如 utf8mb4_general_ci

  • dir:字符集定义文件的目录(通常为空)

  • min_lengthmax_lengthnumberstate:内部使用的字符集信息

例如,使用代码获取当前连接字符集:

<?php
$mysqli = new mysqli('m66.net', 'user', 'password', 'database');

if ($mysqli->connect_error) {
    die('连接失败: ' . $mysqli->connect_error);
}

$charsetInfo = $mysqli->get_charset();
echo '当前字符集: ' . $charsetInfo->charset . PHP_EOL;
echo '排序规则: ' . $charsetInfo->collation . PHP_EOL;

$mysqli->close();
?>

这个方法针对的是当前 PHP mysqli 连接对象的字符集设置,相当于 mysqli_set_charset() 设置或默认值。

2?? SHOW VARIABLES LIKE 'character_set_%' 是什么?

在 MySQL CLI 或其他 SQL 工具中,
你可以通过以下命令查看当前 MySQL 服务端的字符集相关变量:

SHOW VARIABLES LIKE 'character_set_%';

这会列出一系列配置,例如:

  • character_set_client:客户端发送到服务器的字符集

  • character_set_connection:服务器解析语句的字符集

  • character_set_database:当前默认数据库的字符集

  • character_set_results:服务器返回查询结果的字符集

  • character_set_server:服务器默认字符集

  • character_set_system:系统元数据字符集

这些变量涉及 服务器层面会话层面 的字符集,而不仅仅是 PHP 连接。

例如,在 CLI 中运行:

mysql> SHOW VARIABLES LIKE 'character_set_%';

你可能看到:

Variable_nameValue
character_set_clientutf8mb4
character_set_connectionutf8mb4
character_set_databaseutf8mb4
character_set_resultsutf8mb4
character_set_serverutf8mb4
character_set_systemutf8

这些信息更全面地反映了当前 MySQL 实例和会话的字符集配置。

3?? 核心区别

对比点mysqli::get_charsetSHOW VARIABLES LIKE 'character_set_%'
查看对象PHP 中 mysqli 连接对象MySQL 服务器的配置和会话参数
获取范围当前连接的字符集和排序服务端及会话的多个字符集变量
获取方式PHP 方法SQL 语句
用途确认 mysqli 对象使用的字符集查看和调整 MySQL 层面字符集(客户端、连接、数据库等)
影响范围仅影响该 PHP 连接全局/当前会话,多客户端共享

简单来说,mysqli::get_charset() 是 PHP 的一端;
SHOW VARIABLES LIKE 'character_set_%' 是数据库服务端的整体。

4?? 为什么两者都重要?

当我们开发多语言或多地区支持的应用时,
确保客户端(PHP)、连接、数据库及服务器端的字符集保持一致,
是避免乱码的关键。

举个例子:

  • 你可能在 PHP 中设置 mysqli_set_charset('utf8mb4')
    但数据库的 character_set_database 仍然是 latin1
    此时存储进去的数据可能已经出现问题。

  • 通过 mysqli::get_charset(),你可以确认 PHP 连接层是否设置成功;
    而通过 SHOW VARIABLES LIKE 'character_set_%',你可以确认服务器和数据库的默认设置。

两者结合,才能全面掌握字符集链路。

结论

mysqli::get_charset()SHOW VARIABLES LIKE 'character_set_%'
是开发者排查字符集问题的两大利器,
一个在客户端(PHP)侧,一个在服务器(MySQL)侧。

理解两者的区别和关系,
不仅有助于写出高质量、无乱码的应用,
也能在排查跨系统数据流时提供更多线索。

记住:字符集一致性是一项系统工程,
而不仅仅是 PHP 或 MySQL 某一端的配置问题。