在使用PHP 操作MySQL 數據庫時,字符編碼問題往往是開發者們最頭痛的難題之一,尤其是涉及中文、日文、韓文等非英文字符時。很多人遇到插入或查詢數據庫後中文變成亂碼,往往是因為字符集沒有設置正確。
本文將介紹如何使用mysqli::get_charset方法來檢查當前MySQLi 連接的字符集設置,從而確保非英文字符(比如中文)能被正確編碼處理。
MySQL 支持多種字符集,例如latin1 、 utf8 、 utf8mb4等。如果你的網站內容包含中文,推薦使用utf8mb4 ,因為它兼容Emoji 和幾乎所有Unicode 字符。
但僅僅在數據庫層面設置了字符集還不夠,你在PHP 和數據庫之間的連接中也必須設置一致的字符集。否則,發送到數據庫的數據可能在到達前就已經被錯誤編碼,導致亂碼。
mysqli::get_charset方法可以用來查看當前連接使用的字符集信息,返回的是一個包含字符集細節的對象。通過這個方法,你可以寫出檢測代碼來確保連接設置正確。
<?php
// 數據庫連接配置
$host = 'localhost';
$user = 'dbuser';
$password = 'dbpassword';
$database = 'testdb';
// 創建 mysqli 對象
$mysqli = new mysqli($host, $user, $password, $database);
// 檢查連接是否成功
if ($mysqli->connect_error) {
die('連接失敗: ' . $mysqli->connect_error);
}
// 設置字符集為 utf8mb4(推薦支持中文和 Emoji)
if (!$mysqli->set_charset('utf8mb4')) {
die('錯誤設置字符集: ' . $mysqli->error);
}
// 使用 get_charset 檢查當前字符集
$charset_info = $mysqli->get_charset();
echo "當前字符集: " . $charset_info->charset . "<br>";
echo "字符集說明: " . $charset_info->comment . "<br>";
echo "字符集目錄: " . $charset_info->dir . "<br>";
echo "最大字節長度: " . $charset_info->max_length . "<br>";
// 測試插入中文數據
$sql = "INSERT INTO test_table (content) VALUES ('測試中文字符')";
if ($mysqli->query($sql)) {
echo "成功插入中文數據。<br>";
} else {
echo "插入失敗: " . $mysqli->error . "<br>";
}
// 測試從數據庫讀取數據
$result = $mysqli->query("SELECT content FROM test_table ORDER BY id DESC LIMIT 1");
if ($result) {
$row = $result->fetch_assoc();
echo "讀取到的內容: " . $row['content'] . "<br>";
} else {
echo "查詢失敗: " . $mysqli->error . "<br>";
}
// 關閉連接
$mysqli->close();
?>
數據庫表和字段字符集要一致<br> 確保你的表和字段的字符集也是utf8mb 4 ,可以用如下SQL 查看
SHOW CREATE TABLE test_table;
如果不是,可以通過ALTER TABLE改為一致的字符集。
測試頁面編碼<br> 確保你的PHP 頁面本身是用UTF-8 編碼保存的,並且HTTP 響應頭中聲明了正確的Content-Typ e
header('Content-Type: text/html; charset=utf-8');
使用mysqli_report 方便調試<br> 開發中可以啟用MySQLi 報告功能,方便捕捉到隱藏的錯誤
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
相關標籤:
mysqli