下面要寫的是一篇非常無聊的東西,充斥了大量各式各樣的編碼、轉換、客戶端、服務器端、連接……呃,我自己都不願意去看它,但想一想,寫下來還是有點意義的,原因有四:
MySQL 4.1 對多語言的支持有了很大變化 (這導致了問題的出現);
盡管大部分的地方 (包括個人使用和主機提供商),MySQL 3 仍然占主導地位;但 MySQL 4.1 是 MySQL 官方推薦的數據庫,已經有主機提供商開始提供並將會越來越多;
許多 PHP 程序以 MySQL 作為默認的數據庫管理軟件,但它們一般不區分 MySQL 4.1 與 4.1 以下版本的區別,籠統地稱“MySQL 3.xx.xx 以上版本”就滿足安裝需求了;
因為 latin1 在許多地方 (下邊會詳細描述具體是哪些地方) 作為默認的字符集,成功的蒙蔽了許多 PHP 程序的開發者和用戶,掩蓋了在中文等語言環境下會出現的問題;
簡單的說,MySQL 自身的變化和使用 MySQL 的 PHP 程序對此忽略,導致了問題的出現和復雜化,而由於大部分用戶使用的是英文,使這種問題不被重視。這裡提到的 PHP 程序,主要就 WordPress 而言。
MySQL 4.1 字符集支持的原理
MySQL 4.1 對於字符集的指定可以細化到一台機器上安裝的 MySQL,其中的一個數據庫,其中的一張表,其中的一欄,應該用什麼字符集。但是,傳統的 Web 程序在創建數據庫和數據表時並沒有使用那麼復雜的配置,它們用的是默認的配置,那麼,默認的配置從何而來呢?
編譯 MySQL 時,指定了一個默認的字符集,這個字符集是 latin1;
安裝 MySQL 時,可以在配置文件 (my.ini) 中指定一個默認的的字符集,如果沒指定,這個值繼承自編譯時指定的;
啟動 mysqld 時,可以在命令行參數中指定一個默認的的字符集,如果沒指定,這個值繼承自配置文件中的;
此時