问题描述
关于tidb的问题
# tidb正式库
版本:v4.0.0
# tidb测试库
版本:v4.0.8
现在正在恢复一份正式库的数据szdsj ;在恢复数据中 redis_cache这一张表报错。
原因是:正式库中 cacheid` varchar(2000);测试库cacheid`需要改成 varchar(767)
才能创建这一张表,测试库varchar字段超过767就会报错,
1071 - Specified key was too long; max key length is 3072 bytes
报错一
1071 - Specified key was too long; max key length is 3072 bytes
错误分析:redis_cache导入表的索引长度过长,字段cacheid varchar 受到限制。 编码格式:CHARSET=utf8mb4
我的想法
MySQL:ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
TiDB数据库:1071 - Specified key was too long; max key length is 3072 bytes
这个报错,可以突破字段限制吗
比如字符编码:CHARSET=utf8mb4
MySQL 的varchar字段可以使用到 varchar(191)
tidb数据的varchar字段可以使用到varchar(767)
然后怎么才可以把varchar字段达到2000
tidb数据库设置最大索引长度
tidb4.0修改
执行:
tiup cluster edit-config tidb-test
添加以下配置
server_configs:
tidb:
# 以字节为单位设置查询的内存配额。4.0默认1G
mem-quota-query: 1073741824
# 设置最大索引长度
max-index-length: 12288
# 最长的 SQL 输出长度。(变更)4.0需要修改
log.query-log-max-len: 6000
# 设置日志保留天数
log.file.max-days: 10
重新加载配置文件
tiup cluster reload tidb-test -R tidb,tikv
数据库导入完成
MySQL 索引列限制与字符编码
通过查资料(其实就是B度 'Specified key was too long')了解,MySQL 的 varchar 类型的索引列只支持不超过 767 个字节, 或者 768/2=384 个双字节, 或者 767/3=255 个三字节, 或者 767/4=191 个四字节 的字段。
Mysql 不同编码字符对应的字节数如下表
当前MySQL数据库主要以 CHARSET=utf8mb4 为主流
,四字节的字段。