首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Mambo 4.5.3h 在 MySQL 4.1+ UTF-8 環境下安裝「Key too long」錯誤完美解決方案

     編輯:MySQL 資料庫相關知識

問題背景

  • 目標:Mambo 4.5.3h + MySQL 4.1+ + UTF-8 數據庫
  • 現象:安裝報 Specified key was too long; max key length is 1000 bytes
  • 原因:UTF-8 每字符 3 字節,複合唯一索引 VARCHAR(255)*3 > 1000 超限

核心修改三部曲

1. 數據庫默認字符集

ALTER DATABASE mambo_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

2. 修改 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,繞過限制。

3. 修改 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);

安裝驗證

  1. 安裝向導選擇 UTF-8 編碼
  2. 前台中文顯示正常
  3. phpMyAdmin 瀏覽表數據,中文存儲正確(UTF-8)
  4. Discuz 等 UTF-8 應用整合無亂碼

升級維護提醒

每次 Mambo 升級後,必須重新應用 includes/database.php 三行代碼,否則連接層字符集失效導致亂碼。

原理深度解析

層面MySQL 4.0MySQL 4.1+
默認字符集latin1(單字節)latin1(但支持表/列級指定)
索引長度限制1000 字節1000 字節(未變)
UTF-8 存儲按 latin1 存(實為偽 UTF-8)真 UTF-8,3 字節/字符
影響VARCHAR(255) 索引 255 字節VARCHAR(255) 索引 765 字節,複合易超限

本方案通過「關鍵列 latin1 + 其餘 UTF-8」混合策略,兼容舊應用邏輯與新字符集架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved