MySQL 對於字符集的支持細化到四個層次: 服務器(server),數據庫(database),數據表(table)和行()。
查看:
mysqli_query($conn,"set names gb2312");
實質是設置了三個:
上面我們看到,要讓 MySQL 不出現亂碼,要點是在於數據庫連接的編碼方式,而數據庫表的編碼方式並不重要,MySQL 會自動做好編碼轉換工作。
·數據庫表的編碼方式
上面我們看到,要讓 MySQL 不出現亂碼,要點是在於數據庫連接的編碼方式,而數據庫表的編碼方式並不重要,MySQL 會自動做好編碼轉換工作。
那么在做數據庫設計的時候,怎么選擇編碼方式呢?其實這時候考慮的應該是另外幾個因素,比如:
1. 字符集的兼容性。如果預期將在一個字段中同時保存簡體、繁體、日文等字符,那你就必須選擇一個能同時容納這幾種字符集的編碼方式,一般來說,UTF-8 是最好的選擇。
2. 存儲效率。如果預期僅保存簡體中文,那么選擇 GBK 會比 UTF-8 的存儲效率高一些。不過,似乎大多數情況下,這一因素並不很重要。
3. 結合實際的應用情況,盡量減少數據庫訪問過程中的編碼轉換環節。如下圖所示的傳輸過程,其中“C轉換”是客戶端的轉換工作(可能是應用程序負責,也可能是 Driver 負責,比如 JDBC Driver),“S轉換”是服務端的編碼轉換(由 MySQL 自動進行)。
客戶端程序 ------------> 客戶端接口 ----------> 服務端接口 --------------> 數據庫存儲
UCS2/GBK/… C轉換 編碼傳輸 S轉換 UTF-8/GBK/…
客戶端程序 <------------ 客戶端接口 <---------- 服務端接口 <------------ 數據庫存儲
UCS2/GBK/… C轉換 編碼傳輸 S轉換 UTF-8/GBK/…
參考:
【1】http://blog.csdn.net/maquan/article/details/5903131