Specified key was too long; max key length is 1000 bytesVARCHAR(255)*3 > 1000 超限ALTER DATABASE mambo_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
installation/sql/mambo.sql-- A. 所有表引擎聲明追加字符集
TYPE=MyISAM;
→ TYPE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
-- B. 註釋/刪除兩個超長唯一鍵定義
UNIQUE KEY `section_value_value_aro` (`section_value`,`value`)
UNIQUE KEY `#__gacl_section_value_value_aro` (`section_value`,`value`)
-- C. 在 `#__core_acl_aro` 表結構前插入重建語句
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`);
關鍵點:將超長列改為 VARCHAR(240) 並指定 latin1(單字節),索引長度 240*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);
每次 Mambo 升級後,必須重新應用 includes/database.php 三行代碼,否則連接層字符集失效導致亂碼。
| 層面 | MySQL 4.0 | MySQL 4.1+ |
|---|---|---|
| 默認字符集 | latin1(單字節) | latin1(但支持表/列級指定) |
| 索引長度限制 | 1000 字節 | 1000 字節(未變) |
| UTF-8 存儲 | 按 latin1 存(實為偽 UTF-8) | 真 UTF-8,3 字節/字符 |
| 影響 | VARCHAR(255) 索引 255 字節 | VARCHAR(255) 索引 765 字節,複合易超限 |
本方案通過「關鍵列 latin1 + 其餘 UTF-8」混合策略,兼容舊應用邏輯與新字符集架構。