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

MySQL 4.x/5.x 兼容性報錯 "File 'c:\mysql\share\charsets\?.conf' not found (Errcode: 22)" 根因與多種修復方案

     編輯:MySQL 資料庫相關知識

錯誤現象


File 'c:\mysql\share\charsets\?.conf' not found (Errcode: 22)
Character set '#33' is not a compiled character set and is not specified in the 'c:\mysql\share\charsets\Index' file

常見於 **PHP 4.x/5.2 與 MySQL 4.1+/5.0+** 混用環境。PHP 老版本 mysql 客戶端庫 (libmysql.dll) 期望舊版字符集文件結構,而新版 MySQL 安裝目錄結構已變,導致找不到字符集定義文件。

根因深度解析

  • MySQL 4.1+ 重寫了字符集系統,字符集定義文件從 share/charsets/ 移至 share/mysql/charsets/ 或編譯進二進制。
  • PHP 老版本編譯時鏈接的 libmysql.dll 仍按舊路徑 c:\mysql\share\charsets\ 尋找 Index.conf 和各字符集 .conf。
  • 啟動時客戶端庫初始化字符集失敗,報上述錯誤,**但通常不影響實際查詢執行** (僅控制台/日誌噪音)。

方案一:升級 PHP (徹底根治,推薦)

PHP 5.3+ (含 5.3/5.4/5.5/5.6/7.x/8.x) 內建 mysqlnd (MySQL Native Driver) 或更新的 libmysql,完美兼容 MySQL 4.1+ 字符集系統。**這是唯一徹底、安全、無副作用的方案**。

方案二:複製字符集文件到預期路徑 (應急兼容)

  1. 找到 MySQL 安裝目錄真實字符集文件:C:\Program Files\MySQL\MySQL Server 5.x\share\charsets\ (或 share\mysql\charsets\)。
  2. 創建 PHP 期望的目錄:mkdir C:\mysql\share\charsets。
  3. 複製所有文件:xcopy "C:\Program Files\MySQL\MySQL Server 5.x\share\charsets\*" "C:\mysql\share\charsets\" /E /I。
  4. 重啟 Apache/IIS (PHP 進程)。

注意:MySQL 升級後字符集文件可能更新,需定期同步或建立符號鏈接 (Windows mklink /D)。

方案三:修改 PHP.ini output_buffering (神秘工作原理)


; php.ini
output_buffering = On  ; 原為 Off

推測機制:output_buffering=On 使 PHP 輸出緩衝,錯誤信息被捕獲在緩衝區而非直接發送到 SAPI/控制台,「視覺上消失」。**實際字符集初始化失敗仍存在**,可能導致隱性編碼問題。**不推薦作為生產方案**,僅作臨時屏蔽噪音。

方案四:MySQL 配置 my.ini 禁用默認字符集 (治標不治本)


[mysqld]
# default-character-set=utf8  ; 註釋掉或刪除此行
character-set-server=utf8
collation-server=utf8_general_ci

嘗試讓服務端不主動推送字符集信息,減少客戶端初始化失敗機率。效果不穩定。

方案五:Apache + PHP + MySQL 版本不匹配導致圖片/二進制輸出異常

現象:PHP 輸出圖片 (header Content-Type: image/jpeg) 顯示破損,錯誤日誌同樣出現 charsets 錯誤。

根因:phpinfo() 顯示的 Client API version (如 3.23.49) 與實際運行的 MySQL Server version (如 4.1+) 不一致,說明 PHP 加載了舊版 libmysql.dll (可能來自系統目錄 C:\Windows\System32 或舊安裝殘留)。

修復:

  1. 全盤搜索 libmysql.dll,刪除/重命名除 MySQL 安裝目錄 bin\ 和 PHP 目錄 ext\ 外的所有副本。
  2. 重新編譯 PHP (Linux) 或重新安裝 PHP (Windows) 並指定 --with-mysql=mysql安裝路徑 (舊版) 或直接用新版 PHP (內建 mysqlnd)。
  3. 重啟 Apache,驗證 phpinfo() 顯示 Client API version 與 Server version 一致。

總結建議

  1. 首選:升級 PHP 至 5.6+ (安全支援) 或 7.4+/8.x (現代版本),一勞永逸。
  2. 次選:複製字符集文件 / 符號鏈接 維持舊系統運行,並制定遷移計劃。
  3. 禁用:output_buffering 掩蓋錯誤、修改 my.ini 猜測修復,隱患極大。
  4. 排查:libmysql.dll 版本衝突,確保 PHP 加載的客戶端庫與目標 MySQL 版本匹配。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved