Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

Linux 環境源碼編譯安裝 MySQL 5.1 及 PHP 中文亂碼完美解決方案

編輯:關於伺服器

本文記錄在 Linux 環境下從源碼編譯安裝 MySQL 5.1 (指定 GBK 字符集) 及 PHP 連接 MySQL 時中文亂碼的完整解決流程,涵蓋編譯參數、權限初始化、配置文件優化、Navicat 連接設置、PHP 代碼層面編碼統一等關鍵環節。

MySQL 5.1 源碼編譯安裝 (指定 GBK 默認字符集)

  1. 下載解壓:
    wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.1.73.tar.gz
    tar zxvf mysql-5.1.73.tar.gz && cd mysql-5.1.73
  2. 創建專用用戶:
    groupadd mysql && useradd -r -g mysql -s /sbin/nologin mysql
  3. 配置編譯參數 (關鍵:字符集):
    ./configure \ --prefix=/usr/local/mysql \ --with-charset=gbk \ --with-collation=gbk_chinese_ci \ --with-extra-charsets=all \ --with-plugins=innobase,myisam \ --enable-thread-safe-client \ --enable-local-infile
    注意:若報錯 Character set 'gbk' is not a compiled character set,需在 make 時指定:
    make WITH_CHARSET=gbk WITH_COLLATION=gbk_chinese_ci WITH_EXTRA_CHARSETS=all
  4. 編譯安裝:
    make && make install
  5. 配置文件與數據目錄初始化:
    cp support-files/my-medium.cnf /etc/my.cnf
    sed -i 's#^datadir.*#datadir = /usr/local/mysql/var#' /etc/my.cnf
    /usr/local/mysql/bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var
  6. 權限設置與啟動:
    chown -R mysql:mysql /usr/local/mysql /usr/local/mysql/var
    cp support-files/mysql.server /etc/init.d/mysqld
    chmod +x /etc/init.d/mysqld && chkconfig --add mysqld && chkconfig mysqld on
    service mysqld start
  7. 設置 root 密碼與遠程訪問:
    /usr/local/mysql/bin/mysqladmin -u root password 'NewPass123!'
    mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'NewPass123!' WITH GRANT OPTION; FLUSH PRIVILEGES;"

PHP 連接 MySQL 中文亂碼根因分析

亂碼本質是 **編碼不一致**:MySQL 存儲編碼 (GBK/UTF8) ≠ 連接字符集 ≠ PHP 頁面輸出編碼 ≠ 瀏覽器解碼編碼。任一環節不匹配即產生亂碼。

三層編碼統一策略

層級設置點GBK 環境配置UTF-8 環境配置 (推薦)
1. MySQL 服務端my.cnf / 建表語句default-character-set=gbk
建表: CHARSET=gbk
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
2. 客戶端連接PHP 代碼 / PDO / mysqlimysql_query("SET NAMES GBK");$pdo->exec("SET NAMES utf8mb4");
mysqli_set_charset($link, "utf8mb4");
3. 頁面輸出HTTP Header / HTML Metaheader("Content-Type: text/html; charset=gbk");
<meta charset="gbk">
header("Content-Type: text/html; charset=utf-8");
<meta charset="utf-8">

PHP 完整連接示例 (GBK 環境)

<?php
// 1. 設置頁面輸出編碼 (最先執行)
header('Content-Type: text/html; charset=gbk');

// 2. 連接參數
$host = 'localhost:3306';
$user = 'root';
$pass = 'NewPass123!';
$dbname = 'test_db';

// 3. 建立連接 (mysqli 面向對象)
$mysqli = new mysqli($host, $user, $pass, $dbname);
if ($mysqli->connect_errno) {
    die("Connect failed: " . $mysqli->connect_error);
}

// 4. 關鍵: 設置連接字符集 (必須在查詢前)
$mysqli->set_charset("gbk");  // 等同於 SET NAMES GBK

// 5. 執行查詢
$sql = "SELECT id, username, content FROM user_info";
$result = $mysqli->query($sql);

// 6. 輸出
echo "<table border='1'><tr><th>ID</th><th>用戶名</th><th>內容</th></tr>";
while ($row = $result->fetch_assoc()) {
    echo "<tr><td>{$row['id']}</td><td>{$row['username']}</td><td>{$row['content']}</td></tr>";
}
echo "</table>";

$result->free();
$mysqli->close();
?>

Navicat 連接 MySQL 亂碼專項設置

  1. 右鍵連接 →「編輯連接」→「高級」頁籤。
  2. 取消勾選「使用 MySQL 字符集」。
  3. 在「字符集」下拉框手動選擇 GBK (或 UTF-8)。
  4. 點擊「確定」重新連接。

原理:Navicat 默認自動檢測服務端字符集,但 MySQL 5.1 某些版本返回信息不準確,導致 Navicat 使用錯誤編碼發送/接收數據。手動指定可強制統一。

常見亂碼場景速查表

現象可能原因排查順序
存入正常, 讀出亂碼 (??? 或 )連接字符集與存儲編碼不一致檢查 SET NAMES / mysqli_set_charset / PDO::MYSQL_ATTR_INIT_COMMAND
存入亂碼, 讀出正常寫入時連接字符集錯誤同上, 重點檢查 INSERT/UPDATE 前的字符集設置
中文變成亂碼字母 (如 涓婂竷)UTF-8 數據被 GBK 解碼統一全鏈路為 UTF-8 (推薦 utf8mb4)
Emoji 存入報錯 / 變 ??MySQL 字符集非 utf8mb4修改表/庫/連接字符集為 utf8mb4

總結:避免亂碼的黃金法則

  1. 全鏈路統一 UTF-8 (utf8mb4):新項目**強制**使用 utf8mb4,徹底解決 Emoji、生僻字、多語言問題。
  2. 老項目維持 GBK:必須在 **PHP 連接建立後、首條 SQL 前** 執行 SET NAMES GBK。
  3. 頁面輸出 Header 優於 Meta:HTTP Header Content-Type: text/html; charset=xxx 權重高於 HTML <meta charset>。
  4. 工具連接手動指定編碼:Navicat、DataGrip、DBeaver 等 GUI 工具**關閉自動檢測,手動鎖定編碼**。

編碼問題無神秘之處,只有「不一致」。建立「服務端-連接-輸出」三層統一檢查清單,中文亂碼將不再是難題。

Copyright © Windows教程網 All Rights Reserved