首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP MySQL 連線錯誤訊息亂碼解決:mysqli_connect_error 編碼轉換

     編輯:PHP 相關知識

問題現象

<?php
$con = mysqli_connect("localhost", "root", "root", "ehr");
if (!$con) {
    echo 'Connect Error: ' . mysqli_connect_error(); // 輸出中文亂碼
}

錯誤訊息包含中文時顯示亂碼(如 )。

根因

MySQL 錯誤訊息編碼與 PHP 腳本輸出編碼不一致。常見情況:

  • MySQL 伺服器 character_set_server = gbk,錯誤訊息為 GBK 編碼。
  • PHP 腳本輸出 Content-Type: text/html; charset=utf-8。
  • 直接輸出導致瀏覽器以 UTF-8 解碼 GBK 位元組,產生亂碼。

解決方案

方案一:iconv 轉碼(快速修正)

<?php
$con = mysqli_connect("localhost", "root", "root", "ehr");
if (!$con) {
    $err = mysqli_connect_error();
    // 從 GBK 轉 UTF-8
    $err = iconv('GBK', 'UTF-8//IGNORE', $err);
    echo 'Connect Error: ' . $err;
}

方案二:設定連線字元集(根治)

<?php
$con = mysqli_connect("localhost", "root", "root", "ehr");
if (!$con) {
    // 連線失敗時無法設定 charset,仍需 iconv
    $err = iconv('GBK', 'UTF-8//IGNORE', mysqli_connect_error());
    die('Connect Error: ' . $err);
}

// 連線成功後立即設定字元集
mysqli_set_charset($con, 'utf8mb4'); // 推薦 utf8mb4 支援 emoji

// 或 PDO 方式
$pdo = new PDO("mysql:host=localhost;dbname=ehr;charset=utf8mb4", 'root', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

方案三:統一資料庫、連線、輸出編碼為 UTF-8

  1. MySQL 配置 /etc/my.cnf:
    [mysqld]
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    [client]
    default-character-set = utf8mb4
  2. 重啟 MySQL:service mysqld restart。
  3. PHP 腳本輸出標頭:header('Content-Type: text/html; charset=utf-8');。
  4. 資料表/欄位建立時指定 CHARSET=utf8mb4。

最佳實踐封裝

<?php
function mysqliConnect($host, $user, $pass, $db, $charset = 'utf8mb4') {
    $con = @mysqli_connect($host, $user, $pass, $db);
    if (!$con) {
        $err = mysqli_connect_error();
        // 嘗試常見編碼轉換
        $encodings = ['GBK', 'BIG5', 'UTF-8'];
        foreach ($encodings as $enc) {
            $converted = @iconv($enc, 'UTF-8//IGNORE', $err);
            if ($converted !== false && $converted !== $err) {
                $err = $converted;
                break;
            }
        }
        throw new \RuntimeException("MySQL Connect Failed: $err");
    }
    if (!mysqli_set_charset($con, $charset)) {
        throw new \RuntimeException("Set charset $charset failed: " . mysqli_error($con));
    }
    return $con;
}

總結

**根治:MySQL、PHP、HTML 三端統一 UTF-8(utf8mb4)**。臨時修正:iconv('GBK', 'UTF-8//IGNORE', $err)。建議改用 PDO + 例外模式,統一錯誤處理流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved