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。
-- 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 字节。
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 存储问题。