當前位置: 首頁> 最新文章列表> 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_name Value
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8

這些信息更全面地反映了當前MySQL 實例和會話的字符集配置。

3?? 核心區別

對比點mysqli::get_charset SHOW 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 某一端的配置問題。