首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL中文亂碼終極解決方案:Server/Table/Connection三層配置與PHP/Flex實戰驗證

     編輯:MySQL 綜合教學

中文亂碼困擾開發者多年。本文系統梳理MySQL Server/Table/Connection三層配置鏈路,提供PHP/Flex/AMFPHP全棧驗證方案,並揭露my.ini雙路徑尋找、init_connect自動執行等隱藏機制,實現「一處配置、全鏈路生效」。

亂碼產生三大根因

  1. Server層:character_set_server=latin1(預設)
  2. Table層:建表未指定CHARSET=utf8,繼承Server預設
  3. Connection層:客戶端連接未執行SET NAMES utf8,用預設latin1收發

配置文件雙路徑機制(關鍵發現)

MySQL啟動按順序讀取:

  1. C:\Windows\my.ini (或C:\WinNT\my.ini)
  2. C:\my.cnf

⚠️ 兩路徑後綴不同(.ini vs .cnf),早期文檔鮮少強調,導致配置不生效。

標準配置文件內容 (my.ini/my.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
  • Flex/AMFPHP同理:連接建立鉤子處執行

驗證用例:多語言測試字串

-- 測試字串:繁中/簡中/日文/韓文
'不道可否囉'  '不道可否啰'  '日本語'  '한국어'

寫入→讀出無口字/亂碼即通過。

全棧驗證矩陣

常見坑位避雷

  1. 以為[client]配置通用:僅MySQL官方程式讀取,PHP/JDBC/ODBC均忽略
  2. init_connect對root不生效:SUPER權限用戶跳過init_connect
  3. PHP mysql_*函數已棄用:新項目用mysqli/PDO,SET NAMES改為$mysqli->set_charset('utf8')
  4. utf8 vs utf8mb4:Emoji/生僻字需utf8mb4,表/連接/Server三層同步升級

Flex 2 + AMFPHP + PHP + MySQL 驗證通過

端到端中文傳輸無亂碼,確認方案在RIA架構下同樣有效。

「Server定預設、Table顯式宣告、Connection強制SET NAMES」三層防線,配合連接池鉤子機制,徹底終結中文亂碼困擾。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
層級配置點生效範圍驗證結果
Servermy.ini [mysqld] charset新建庫/表默認✅
TableCREATE TABLE ... CHARSET=utf8單表存儲✅
Connectionmy.ini [client] + init_connect官方工具自動⚠️ 僅官方工具
Connection應用代碼 SET NAMES utf8所有自建連接✅ 核心保障