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;
效果:
header('Content-Type: text/html; charset=gbk'))。<?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 三者
// 執行查詢...
?>
SET character_set_results = NULL 或 SET NAMES gbk 相容共存。my.ini 而不處理既有資料,會導致新舊資料混雜亂碼。