您在這裡

Linux 下使用 utf8 的安裝問題

Jinuske's 的頭像
Jinuske 在 2006-05-20 (週六) 23:47 發表

想請教各位先進:

我使用 CentOS 架設伺服器,Apache 2.0.52, PHP 4.3.9, MySQL 4.1.12。

為了讓資料庫中的資料都是 unicode ,輸出入都要沒有問題,所以修改了 my.cnf 中的一些資訊:

[mysqld]
init_connect='SET NAMES utf8'
default-character-set=utf8
default-collation=utf8_general_ci
[mysql]
default-character-set=utf8

這些原則上是之前安裝 LifeType 時上網找資料綜合的,本來都沒有用 phpMyAdmin ,後來為了驗證也安裝了,看起來資料都正常。

我安裝測試了 Drupal 4.7, CivicSpace 0.8.4alpha2(因為要測試它那幾個特殊的模組),結果發現 Drupal 4.7 沒有問題,而 CivicSpace 對中文某些字似乎會出現問題,例如“及“這個字,會造成顯示亂碼,進資料庫看也是一樣。

想要請教大家的是:

1. 安裝 Drupal,為了讓資料庫純粹都是 utf8 的文字編碼格式,上面 my.cnf 中的設定是否必要?
2. 我猜想 CivicSpace 應該是因為它的自動安裝程式,不知道是否有人之前安裝過?會不會出現相同的問題呢?
3. 我搞不清楚使用 utf8_general_ci 與 utf8_unicode_ci 之間的差別,對資料庫以及 Drupal 運作有沒有不同?

如果有先進在 Linux 上安裝 Drupal 以及與中文萬國碼設定相關的經驗,煩請指教一下。

我的經驗是,如果是4.6以下或是衍伸出來的版本,加上那些設定是必要的
原因是因為4.7的版本在database/database.4.1.mysql裡面多加了這樣的語法

CREATE TABLE access (
 ...
 ...
)DEFAULT CHARACTER SET utf8;

所以4.7基本上不需要在my.ini做那些設定
除非額外裝的module寫的create table語法中,沒有包含這樣的敘述
不然應該是沒問題的

另外,其實除了調整my.ini還有其他替代的做法
如果一個mysql裡面有多語言的db,那就不適合用my.ini去做全域的設定
替代的方式為在 include/database.mysql.ini找到function db_connect

function db_connect($url) {
.....
.....
  $connection = mysql_pconnect($url['host'], $url['user'],
    $url['pass'], TRUE) or die(mysql_error());
  
  mysql_select_db(substr($url['path'], 1), $connection)
   or die('unable to select database');

  return $connection;
}

加上三行mysql的設定

function db_connect($url) {
.....
.....
  $connection = mysql_pconnect($url['host'], $url['user'],
    $url['pass'], TRUE) or die(mysql_error());
  
  mysql_query('SET NAMES "UTF8"');
  mysql_query("SET collation_connection='utf8_general_ci'");
  mysql_query("SET collation_server='utf8_general_ci'");

  mysql_select_db(substr($url['path'], 1), $connection)
   or die('unable to select database');

  return $connection;
}

這樣的好處是在mysql 4.1以上的版本,可以一個database用多種語言集
但壞處是每一個connection都要做那一次設定

--
from open mind to open source~

感謝 jimmy 的詳細解說,大致上可以搞清楚之間的差別了。

這樣看來,還是應該在新增模組之前檢查一下它的語法,萬一它指定了其他的編碼方式,就有可能造成差異。

但是除了在新增資料庫的部份之外,是否還有其他地方有可能造成編碼上的失誤呢?

由於我是在全新的機器上修改過 MySQL 的設定後,還在 Linux 中進入 mysql> show variables like '%character%'; 檢查過,才開始安裝 CivicSpace 與 Drupal 的,而 CivicSpace 卻發生了文字編碼上的部份錯誤,我還沒有檢查過個別的檔案,但看來其中一定還有地方有問題,我研究過之後再報告。

看看CivicSpace的資料庫編碼,是不是utf8_general_ci?

我裝Drupal 4.7、用phpmyadmin建立資料庫時,有時沒有設定資料庫編碼,結果在新增模組的資料表時,有時就會變成latin1_general_ci,然後就亂碼...

對,third party提供的模組,很多時候並不會預設utf-8編碼
因為mysql預設是latin1,對英語系的網站而言根本沒有影響

這也是主流語言的霸權啊!

--
from open mind to open source~