mysql 索引太长,Mysql索引过长问题解析

本文探讨了MySQL中VARCHAR类型的实际存储机制,并解释了不同编码下索引字段的最大长度限制,如UTF-8编码下的VARCHAR(255)及UTF8-BM4编码下的VARCHAR(191)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近期遇到两次mysql建表时,提示索引过长错误信息的问题。

28e86713ca36

根据错误信息提示,检查建表语句,发现对应的索引字段为VARCHAR(256).与提示的767bytes长度相差较大。由此引出Mysql(大多数数据库对varchar类型处理都基本相似)对VARCHAR类型的处理机制的探讨。

在Mysql中,varchar类型的单位其实是 “字符” ,而非我们字节。是一种自适应的存储方式。

例如:VARCHAR(3)  既可以存储 "abc"三个英文字符 ,此时存储长度为3个字节,也可以存储 "数据库" 三个中文字符,此时存储长度不少于9个字节,但无法存下 "abcd"四个英文字符。

因此我们在设计数据库字段,遇到可变长varchar类型时,应当考虑其实际空间占用上限。

值得注意的是,可变长字段的占用上限与数据库采用的编码相关,我们的数据库采用的UTF-8,最宽字符长度为 3字节中文字符。因此可计算出索引字段的最大设计长度为

767/3=255,即 当数据库编码为UTF-8时,索引字段能支持的最大VARCHAR字段长度定义为VARCHAR(255)

以此扩展,如果为UTF8-BM4编码,此时该编码支持4字节的宽字符,长度设计上限则应为 767/4 = 191,即 VARCHAR(191)

注:对定长类型按类型指定长度或者类型默认字节数计算即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值