中文亂碼困擾開發者多年。本文系統梳理MySQL Server/Table/Connection三層配置鏈路,提供PHP/Flex/AMFPHP全棧驗證方案,並揭露my.ini雙路徑尋找、init_connect自動執行等隱藏機制,實現「一處配置、全鏈路生效」。
character_set_server=latin1(預設)CHARSET=utf8,繼承Server預設SET NAMES utf8,用預設latin1收發MySQL啟動按順序讀取:
C:\Windows\my.ini (或C:\WinNT\my.ini)C:\my.cnf⚠️ 兩路徑後綴不同(.ini vs .cnf),早期文檔鮮少強調,導致配置不生效。
[mysqld]
default-character-set=latin1 # 建議保持latin1,避免第三方軟體(OSCommerce/MediaWiki)相容性問題
# character-set-server=utf8 # 5.5+ 參數名
[client]
default-character-set=utf8
init_connect='SET NAMES utf8' # 關鍵:僅MySQL官方客戶端工具生效(mysql/mysqladmin/CC)
獨立連接配置文件 (如db_config.php):
<?php
$host = 'localhost';
$link = mysql_connect($host, 'user', 'pass');
mysql_query("SET NAMES 'utf8'", $link); // 關鍵:連接建立後立即執行
mysql_select_db('db_name', $link);
?>
SET NAMES utf8-- 測試字串:繁中/簡中/日文/韓文
'不道可否囉' '不道可否啰' '日本語' '한국어'
寫入→讀出無口字/亂碼即通過。
| 層級 | 配置點 | 生效範圍 | 驗證結果 |
|---|---|---|---|
| Server | my.ini [mysqld] charset | 新建庫/表默認 | ✅ |
| Table | CREATE TABLE ... CHARSET=utf8 | 單表存儲 | ✅ |
| Connection | my.ini [client] + init_connect | 官方工具自動 | ⚠️ 僅官方工具 |
| Connection | 應用代碼 SET NAMES utf8 | 所有自建連接 | ✅ 核心保障 |