MySQL 4.1+ 預設支援 UTF-8(3 bytes/字元),導致 VARCHAR(255) UTF8 索引長度 765 bytes 超過 MyISAM 1000 bytes 單索引上限,安裝報錯 Specified key was too long; max key length is 1000 bytes。同時字元集不匹配造成前後台亂碼。
latin1 儲存中文雖能顯示,但實為亂碼,phpMyAdmin 不可讀、備份不可用utf8 資料庫下,安裝腳本 mambo.sql 含長度 255 的唯一索引,編碼為 UTF-8 時超長ALTER DATABASE `mambo_db` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
或 phpMyAdmin → 資料庫 → 操作 → 字元集/排序規則 選擇 utf8_general_ci。
installation/sql/mambo.sqlTYPE=MyISAM; 替換為TYPE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;#)以下兩行:UNIQUE KEY `section_value_value_aro` (`section_value`, `value`)UNIQUE KEY `#__gacl_section_value_value_aro` (`section_value`, `value`)# Table structure for table `#__core_acl_aro_groups` 之前插入修正語句:ALTER TABLE `#__core_acl_aro` CHANGE `section_value` `section_value` VARCHAR(240) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '0';
ALTER TABLE `#__core_acl_aro` CHANGE `value` `value` VARCHAR(240) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '';
ALTER TABLE `#__core_acl_aro` ADD UNIQUE `section_value_value_aro` (`section_value`, `value`);
ALTER TABLE `#__core_acl_aro` ADD UNIQUE `#__gacl_section_value_value_aro` (`section_value`, `value`);
將長度從 255 降為 240,並指定 latin1 避免 UTF-8 3倍膨脹,索引長度 240*1*2=480 < 1000,符合限制。
includes/database.php 強制連線字元集找到 $this->_table_prefix = $table_prefix; 之後插入:
mysql_query("SET NAMES 'utf8'", $this->_resource);
mysql_query("SET CHARACTER SET utf8", $this->_resource);
mysql_query("SET COLLATION_CONNECTION='utf8_general_ci'", $this->_resource);
執行安裝精靈,語言/編碼步驟選 UTF-8 完成安裝。
Mambo 升級覆蓋 includes/database.php 時,必須重新套用上述三行 SET NAMES 代碼,否則升級後亂碼復發。
此方案經多環境驗證,徹底解決 Mambo 4.5.3h 在 MySQL 4.1+ UTF-8 下的安裝與亂碼問題。