很久以前,我寫過一篇「MySQL 中文編碼徹底研究」,簡單介紹了如何將 MySQL 4.0 轉換到 MySQL 4.1 時要注意的部份。

註:大家可以把這篇「MySQL 中文編碼徹底研究」當做是本人在拙作「PHP Smarty 樣版引擎」中的觀念修正文。

不過我想還是會有很多朋友會覺得該文寫的東西還是有點雜亂,尤其在 BIG5 和 UTF-8 之間的切換,可能讓很多人看完還是一頭霧水。

所以,就目前時下網路服務都是用 UTF-8 做為溝通間的編碼這點來看,這裡我建議大家乾脆就一律用 4.1 以上的版本吧!省得在切換這些編碼時搞得自己身心俱疲。

接下來我會快速為大家介紹 MySQL 4.1 以上的版本,在使用編碼上的一些觀念。

MySQL 4.1+ 編碼

編碼的影響範圍

MySQL 4.1 以後的編碼影響層級可細分為三層:資料庫、資料表、欄位。

編碼影響範圍

一般來說,我們只要對資料表設定編碼即可,其下所擁有的資料表和資料欄位的編碼與資料庫設定的一致。但如果針對資料庫和資料欄位設定不同的編碼也是可以的,只要我們在創建它們時指定字集和校對即可。

字集與校對

MySQL 4.1 + 之後就引入二階式的編碼設定:字集 (character set) 及校對 (collation) 。

字集一般就是我們說的編碼,例如 UTF-8 或 BIG5 等;校對則是再針對字集裡分出二進制 (bin) 或多種語言並不分大小寫 (xxx_ci) 等特性。

所以一般選完字集後,我們就會需要再選擇校對。對一般欄位來說,校對並不需要區分大小寫 (xxx_ci) ,但是如果較為重要的欄位 (例如密碼) ,就要選擇二進制 (bin) 。

那麼哪個字集比較好呢?

就是 UTF-8

UTF-8 是目前網站開發編碼的不二人選,它的優點這裡我就不再多加闡述了。如果以前各位是慣用 BIG5 或是 Latin-1 等編碼的話,在新網站就改用 UTF-8 吧。

註:舊網站的編碼需不需要升級?這點就留給大家自行判斷吧。

很多朋友在從 MySQL 4.0 轉換成 MySQL 4.1 以上版本時,常會有 PHP 把從 MySQL 取得的資料輸出為問號,或是文字顯示為亂碼的困擾。其實要解決這樣的問題很簡單,以下幾個小地方注意即可。

輸出至瀏覽器的編碼操作

  • PHP 在從 MySQL 存取資料之前,利用 SET NAMES UTF8 告訴 MySQL 接下來的資料都要轉換為 UTF8 。
  • PHP 輸出資料給 Browser 時,要在 Header 指定正確的編碼。
  • 有時候瀏覽器需要 meta 標籤指定編碼,所以在 <title> 標籤之前把正確的 meta 標籤設定好。
  • 當然別忘了你的 HTML Template 的編碼也是要用 UTF-8 。

就是這麼簡單,別再為 MySQL 的編碼困擾了!更詳盡的介紹就請參考本人的拙作:「MySQL 中文編碼徹底研究」吧!