解决MySQL数据库索引过长的问题。

MySQL报错:

[Err] 1709 - Index column size too large. The maximum column size is 767 bytes.

在一个长度大于255的字符的字段上创建unique key报错。

原因:

MySQL用1到2个额外字节记录该字段的长度,当字段长度小于等于255时使用1个字节记录字段长度,当长度大于255时使用2~4个字节记录字段长度,字段file_path的长度为512*3+2=1538个字节,超过系统默认767字节数限制。

解决方式:

1.show variables like 'innodb_large_prefix'; 查看结果是否为ON

mysql> show variables like 'innodb_large_prefix';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_large_prefix | ON    |
+---------------------+-------+
1 row in set

2.show variables like 'innodb_file_format'; 查看结果是否为Barracuda

mysql> show variables like 'innodb_file_format';
+--------------------+-----------+
| Variable_name      | Value     |
+--------------------+-----------+
| innodb_file_format | Barracuda |
+--------------------+-----------+
1 row in set

3.修改建表语句。增加 ROW_FORMAT=DYNAMIC 属性。

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
	`id` VARCHAR (64) NOT NULL COMMENT 'id',
	`name` VARCHAR (64) NOT NULL COMMENT '姓名',
	`keyword` VARCHAR (1000) NOT NULL COMMENT '关键字',
	PRIMARY KEY (`id`) USING BTREE,
	KEY `idx_keyword` (`keyword`) USING BTREE
) ENGINE = INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT = '测试';

-----------------------------------------------------------------------------------------
[SQL]DROP TABLE IF EXISTS `user`;
受影响的行: 0
时间: 0.006s

PS:修改语句:

1.set global innodb_large_prefix='on';

2.set global innodb_file_format='Barracuda';

补充:

最近做项目,自己本地数据库是5.x版本的,但是开源框架(ruoyi)上面的数据库是8.X版本的,在导入数据库sql的时候,也会有索引过长的问题。

处理方式:

除了在建表语句后加 ROW_FORMAT=DYNAMIC;然后就是调整数据库版本。

个人建议直接更新数据库就好了。

你可能感兴趣的:(开发过程中遇到的问题和解决方案,mysql)