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

MySQL 建表报错 "Specified key was too long; max key length is 1000 bytes" 解决方案

     編輯:MySQL 資料庫相關知識

索引长度超限 1000 字节根因与三种修复路径

UTF-8 下 VARCHAR(255) 占 765 字节,联合索引两列即超 1000 字节限制(MyISAM/旧版 InnoDB)。

方案一:缩短列长度(最直接)

-- 将 VARCHAR(255) 改为 VARCHAR(191) 或更短
ALTER TABLE t MODIFY col VARCHAR(191) CHARSET utf8;

191 × 3 = 573,两列联合索引 1146 仍超限,建议单列 ≤ 170 或改用 utf8mb4 + innodb_large_prefix。

方案二:切换存储引擎为 InnoDB + 开启大前缀(推荐 5.7+)

-- my.cnf
[mysqld]
innodb_file_per_table = ON
innodb_large_prefix = ON
-- 重启后建表指定 ROW_FORMAT=DYNAMIC 或 COMPRESSED
CREATE TABLE t (...) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;

支持索引长度至 3072 字节。

方案三:动态安装 InnoDB 插件(旧版本无 InnoDB 时)

SHOW VARIABLES LIKE 'have_%';  -- 确认 have_dynamic_loading=YES
INSTALL PLUGIN INNODB SONAME 'ha_innodb.so';
SHOW ENGINES;

附:新建数据库与用户标准化流程

CREATE USER 'bob'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'bob'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'bob'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

CREATE DATABASE travel CHARACTER SET utf8 COLLATE utf8_general_ci;

# 导入数据
mysql -uroot -p travel < travel20120410.sql

远程连接验证

mysql -ubob -pbob -h192.168.19.182 travel

最佳实践:新建表默认 CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC,彻底规避索引长度与 Emoji 存储问题。

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