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 安裝目錄結構已變,導致找不到字符集定義文件。
share/charsets/ 移至 share/mysql/charsets/ 或編譯進二進制。libmysql.dll 仍按舊路徑 c:\mysql\share\charsets\ 尋找 Index.conf 和各字符集 .conf。PHP 5.3+ (含 5.3/5.4/5.5/5.6/7.x/8.x) 內建 mysqlnd (MySQL Native Driver) 或更新的 libmysql,完美兼容 MySQL 4.1+ 字符集系統。**這是唯一徹底、安全、無副作用的方案**。
C:\Program Files\MySQL\MySQL Server 5.x\share\charsets\ (或 share\mysql\charsets\)。mkdir C:\mysql\share\charsets。xcopy "C:\Program Files\MySQL\MySQL Server 5.x\share\charsets\*" "C:\mysql\share\charsets\" /E /I。注意:MySQL 升級後字符集文件可能更新,需定期同步或建立符號鏈接 (Windows mklink /D)。
; php.ini
output_buffering = On ; 原為 Off
推測機制:output_buffering=On 使 PHP 輸出緩衝,錯誤信息被捕獲在緩衝區而非直接發送到 SAPI/控制台,「視覺上消失」。**實際字符集初始化失敗仍存在**,可能導致隱性編碼問題。**不推薦作為生產方案**,僅作臨時屏蔽噪音。
[mysqld]
# default-character-set=utf8 ; 註釋掉或刪除此行
character-set-server=utf8
collation-server=utf8_general_ci
嘗試讓服務端不主動推送字符集信息,減少客戶端初始化失敗機率。效果不穩定。
現象: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 或舊安裝殘留)。
修復:
libmysql.dll,刪除/重命名除 MySQL 安裝目錄 bin\ 和 PHP 目錄 ext\ 外的所有副本。--with-mysql=mysql安裝路徑 (舊版) 或直接用新版 PHP (內建 mysqlnd)。phpinfo() 顯示 Client API version 與 Server version 一致。