首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 4.1 中文亂碼完美解決方案:字元集設定與查詢層面修正

     編輯:MySQL 資料庫相關知識

問題背景

MySQL 4.1 引入完整字元集支援,但預設連線字元集常導致中文亂碼。本文提供不修改 my.ini 的解決方案。

資料庫/資料表/欄位層面設定

建立時指定字元集 (推薦)

CREATE DATABASE mydb DEFAULT CHARACTER SET gbk;
CREATE TABLE mytable (
    id INT PRIMARY KEY,
    title VARCHAR(100) CHARACTER SET gbk,
    content TEXT CHARACTER SET gbk
) DEFAULT CHARSET=gbk;

關鍵點: 文本類型欄位 (VARCHAR, TEXT 等) **務必** 明確指定 CHARACTER SET gbk (或 utf8/utf8mb4),資料庫/資料表預設值僅作為後續建立欄位的預設。

既有資料表轉換字元集

-- 兩步驟法 (避免資料損壞)
ALTER TABLE mytable MODIFY title BINARY(100);      -- 1. 先轉為二進制移除字元集標記
ALTER TABLE mytable MODIFY title VARCHAR(100) CHARACTER SET gbk; -- 2. 再指定正確字元集

連線/查詢層面修正 (核心解法)

問題現象

若在 my.ini 設定 default-character-set=gbk,未轉換編碼的舊欄位會變亂碼;若不設定,轉換過的欄位查詢結果又是亂碼。

完美解法:查詢前執行

SET character_set_results = NULL;

效果:

  • **已轉換編碼的欄位**:正常顯示中文,且可正確中文排序。
  • **未轉換編碼的舊欄位**:也不會出現亂碼。
  • **原理**:關閉結果集字元集轉換,直接回傳儲存位元組,由應用層處理編碼 (如 PHP header('Content-Type: text/html; charset=gbk'))。

PHP 應用層配合設定

<?php
$conn = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('mydb', $conn);

// 關鍵:查詢前設定結果集字元集為 NULL
mysql_query("SET character_set_results = NULL", $conn);

// 或者明確指定連線字元集 (MySQL 4.1+)
mysql_query("SET NAMES gbk", $conn);  -- 等同於設定 client/connection/results 三者

// 執行查詢...
?>

總結建議

  1. 新專案:**全面採用 UTF-8 (utf8mb4)**,資料庫、資料表、欄位、連線、HTML 頁面、PHP 檔案編碼全部統一。
  2. 舊專案遷移:採用「兩步驟 ALTER」轉換欄位編碼,查詢層用 SET character_set_results = NULL 或 SET NAMES gbk 相容共存。
  3. 不要只改 my.ini 而不處理既有資料,會導致新舊資料混雜亂碼。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved