首页
学习
活动
专区
圈层
工具
发布

MySQL中索引的长度的限制

参考: http://dinglin.iteye.com/blog/1681332 单列索引的长度的限制     (5.6里面默认不能超过767bytes,5.7不超过3072bytes):     起因是...--- by 阿里-丁奇 在MySQL5.6里默认 innodb_large_prefix=0 限制单列索引长度不能超过767bytes    官网文档:https://dev.mysql.com/doc.../refman/5.6/en/innodb-parameters.html#sysvar_innodb_large_prefix 注意: 在MySQL5.6里面,设置了innodb_large_prefix...在MySQL5.7里默认 innodb_large_prefix=1 解除了767bytes长度限制,但是单列索引长度最大还是不能超过3072bytes 联合索引的长度的限制 (不能超过3072bytes...又由于InnoDB的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过4k (极端情况,primay-key和某个二级索引都达到这个限制)。

7.7K30

技术分享 | MySQL 索引长度限制的案例

作者:刘晨 网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升方面的工作,Oracle ACE ,拥有 Oracle OCM & OCP 、EXIN DevOps Master...执行的 SQL,select c1, c2 from test where c1 = :1,c1数据类型是varchar(255) ,区分度较高,需要创建一个单键值索引。...我们知道,MySQL 和 Oracle 在索引上最大的一个区别,就是索引存在长度的限制。如果是超长键值,可以支持创建前缀的索引,顾名思义,取这个字段的前多少个字符/字节作为索引的键值。...对于非二进制的字符串类型(CHAR、VARCHAR、TEXT),前缀会按照字符个数计算,对二进制的字符串类型(BINARY、VARBINARY、BLOB),前缀会按照字节个数计算,因此,当对非二进制的字符串列明确前缀长度的时候...MySQL 官方手册索引的章节提到了,前缀索引长度限制是和引擎相关的,如果用的是 InnoDB ,前缀上限是 767 字节,当启用 innodb_large_prefix 时,上限可以达到 3072 字节

5.3K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    小白学习MySQL - 索引键长度限制的问题

    最近在工作中,碰到了个很诡异的问题,需求是在两个MySQL数据库为同一张表增加一个二级索引(单键值字段(x varchar(500))),表结构和加索引的语法,都是相同的,但是一个库执行成功了,一个执行失败了...MySQL中还会对索引键的长度有限制?...我们首先从《MySQL 5.6 Reference Manual》的"CREATE INDEX"章节看起,他指出如果是字符串类型的字段,可以指定字符串前多少位创建索引键值,而且键值前缀是存在上限的,在CREATE...TABLE、ALTER TABLE、CREATE INDEX语句中,对于非二进制的字符串类型(CHAR、VARCHAR、TEXT),前缀会按照字符个数计算,对二进制的字符串类型(BINARY、VARBINARY.../en/create-index.html 前缀的长度限制,是和存储引擎相关的。

    4.5K31

    详解 mysql int 类型的长度值问题

    创建数据库的时候发现一个问题: 改变 length 的值, 不能影响到实际的存储长度!...秉着好奇心, 打开了 google ~ 引入大神的解答. mysql 在建表的时候 int 类型后的长度代表什么? 是该列允许存储值的最大宽度吗?...所以我在网上查阅了一些资料, 也仔细的看了 mysql 手册关于 int data type 的说法. 以下是每个整数类型的存储和范围 (来自 mysql 手册) ?...mysql 我们看到现在我的 number 字段, 长度 (M)=5, 属性 =UNSIGNED ZEROFILL(无符号, 用 0 来填充位数), 设置这个属性后我往表时插入数据, 系统会自动把 number...mysql 手册上还有这么一句话 "当 mysql 为某些复杂的联结 (join) 生成临时表时,你可能会遇到问题,因为在这种情况下,mysql 信任地认为所有的值均适合原始的列宽度".

    5K20

    mysql使用联合索引提示字符长度超限制解决办法

    这个就是因为联合所以长度限制的。 我们来看看MySql InnoDB引擎对索引长度的限制: mysql单索引限制: 在默认情况下,InnoDB对单一的字段索引长度限制最大为767个字节。...这个长度怎么来的呢 ?当mysql创建数据库的时候,字符集使用的是UTF-8的时候,我们知道UTF-8每个字符使用三个字节来存储的。即:256*3-1=767了。...这个767字符大小的限制就是从这里来的。 联合索引(前缀索引)限制: 同样的,mysql对前缀索引也有同样的限制。根据字符集不同,长度限制也不同。...字符集使用utf8的时候长度限制是:767个 使用uft8mb4的时候长度限制是:3072个 但是,在文章一开始,凯哥就强调了,凯哥数据库使用的字符集是:utf8mb4。...如果没有开启这个,InnoDB会对,无论什么表索引键长度限制都是767了。 解决方案有两种: 1:mysql系统变量innodb_large_prefix开启。

    4.9K00

    String还有长度限制?是多少?

    前言 话说Java中String是有长度限制的,听到这里很多人不禁要问,String还有长度限制?是的有,而且在JVM编译中还有规范,而且有的家人们在面试的时候也遇到了。...[1240] 那么String既然是数组存储那数组会有长度的限制吗?是的有限制,但是是在有先提条件下的,我们看看String中返回length的方法。...[1240] 由此我们看到返回值类型是int类型,Java中定义数组是可以给数组指定长度的,当然不指定的话默认会根据数组元素来指定: int[] arr1 = new int[10]; // 定义一个长度为...10的数组 int[] arr2 = {1,2,3,4,5}; // 那么此时数组的长度为5 整数在java中是有限制的,我们通过源码来看看int类型对应的包装类Integer可以看到,其长度最大限制为...其实这里涉及到了JVM编译规范的限制了,其实JVM在编译时,如果我们将字符串定义成了字面量的形式,编译时JVM是会将其存放在常量池中,这时候JVM对这个常量池存储String类型做出了限制,接下来我们先看下手册是如何说的

    3.8K10

    iOS UITextField 限制输入长度控件

    在项目中,UITextField基本上都要求输入长度限制,通常的做法是监听UITextField [self.textField addTarget:self action:@selector(textFieldDidChange...positionFromPosition:selectedRange.start offset:0]; CGFloat maxLength = 8; // 没有高亮选择的字,则对已输入的文字进行字数统计和限制...textField.text = [toBeString substringWithRange:rangeRange]; } } } } 然后在监听的方法里面控制输入长度...但是如果有很多页面都要求UITextField输入限制,每个页面都加监听太麻烦了 所以我们可以提取一个Category UITextField+Expand.h #import <UIKit/UIKit.h...[textField positionFromPosition:selectedRange.start offset:0]; // 没有高亮选择的字,则对已输入的文字进行字数统计和限制

    4.3K20

    varchar有最大长度限制吗

    先说结论,mysql 中的 varchar 是有最大长度限制的,这个值是 65535 个字节。 varchar(100),这个 100 的单位是啥,这个单位其实在不同版本中是不一样的。...另外 char 也是有最大长度限制的,最大长度为 255, 即 char 类型最多只能保存 255 个字符,char(256) 这都是错误的写法,可以看下面的例子。...也就是说在 varchar 类型中,除了字符本身实际占用的空间外,还需要 1 个或 2 个字节来声明这个字符的长度。...65535 个字节呢,其实这个是受 mysql 另一个规则限制导致的,mysql 规定了每行数据大小不能超过 65535 个字节。...最后再看一个综合例子,我们创建一个表,采用 UTF8 字符集,添加两个非空字段,分别为 char 和 varchar 类型,char 类型长度给定为 255。

    19.4K21

    一文搞懂MySQL表字段类型长度的含义

    不知道大家第一眼看标题的时候有没有理解,什么是“字段类型长度”,这里我来解释下,就比如我们在MySQL建表的时候,比如下面这个建表语句:CREATE TABLE `user` ( `id` int(10...+数字就是该字段的类型长度,比如int(10)就是该字段是int类型长度为10,这下大家应该能理解什么是MySQL表字段类型长度了吧(其实在后续的讲解中会发现这个并不是长度,而是宽度)那么重点问题来了,...(3)提供了相关操作JSON类型数据的函数1.3 数据类型说明MySQL的数据类型长度是固定的,而不是由建表时指定的,unsigned表示无符号类型CREATE TABLE `table01` ( `...,进行排序和创建临时表一类的内存操作时,会使用N的长度申请内存VARCHAR(N),如果N长度,如果N>=256则使用两个字节来存储长度3 结论MySQL建表语法再次说明:...;对某些值的宽度短于该列宽度的值进行左填补显示的,而不是为了限制在该列中存储值的宽度,也不是为了限制那些超过该列指定宽度的值的可被显示的数字位数,因此我们得出一下结论:对于数值类型,可以不指定宽度,使用默认长度即可

    3.2K11

    MYSQL数据库约束类型

    07.14自我总结 MYSQL数据库约束类型 一.主键约束(primary key) 主键约束要求主键列的数据唯一,并且不能为空。主键分为两种类型:单字段主键和多字段联合主键。...,字段n] 2.自动增长 只能与primary key 联用 语法:字段 数据类型 primary key auto_increment n #n为起始位置,可以不填不填默认从1开始 二.外键约束(foreign...非空约束 语法规则:字段名 数据类型 not null 创建表格后 alter table test modify 段名 数据类型 not null; 四.唯一性约束(Unique) 指定唯一约束 唯一约束...语法规则:字段名 数据类型 Uniquel 再所有列创建完毕后:unique (字段名称) 创建表格后 alter table test modify 段名 数据类型 Unique; 五.默认约束(Default...语法规则: 字段名 数据类型 Dfault 默认值 创建表格后 alter table test modify 段名 数据类型 Dfault 默认值;

    3.8K10

    MySQL数据库,浅谈MySQL分区表优点和限制

    作为MySQL数据库中的一个重要机制,MySQL分区表优点和限制也是一目了然的,然而又能够同时实现共存。 一、我们先来看MySQL分区表优点: 1、与单个磁盘或文件系统分区相比,可以存储更多的数据。...二、 说完了MySQL分区表优点,我们再来说说MySQL分区表限制。...当查询访问分区表的时候,MySQL需要打开并锁住所有的底层表,这是分区表的另一个开销。这个操作在分区过滤之前发生,所以无法通过分区过滤降低此开销,并且该开销也和分区类型无关,会影响所有的查询。...在按HASH和KEY分区的情况下,任何产生NULL值的表达式mysql都视同它的返回值为0。为了避免这种情况的产生,建议分区键设置成NOT NULL。...以上就是为大家罗列出的MySQL分区表的优点和限制,我们不难看出尽管MySQL分区表有着十分出众的优点,但其本身存在的限制也是很多的,这就需要我们通过不断的改善和发展技术来实现MySQL分区表的发展。

    4.7K20

    字节|字符、字段类型长度

    常用的字段数据类型: int:整型 double:浮点型,例如double(5,2)表示最多5位,其中必须有2位小数,即最大值为999.99; char:固定长度字符串类型; char(10) 如果不足...10位则会自动补足10位:'abc ' varchar:可变长度字符串类型;varchar(10) 如果不足10位不会补足:'abc',性能不如char高 text:字符串类型;适用于大文本内容。...datetime:日期时间类型 yyyy-MM-dd hh:mm:ssmysql字段每个类型长度大小与建表的类型长度:在创建数据库表时,例如create table user(id int(4) primary...,显示宽度只是指明Mysql最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型的取值范围,数值依然可以插入,而且能够显示出来。...一个汉字和英文就是一个字符,如'1', '中', 'a', '$', '¥',…… - 字节 :计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间,如0x01, 0x45, 0xFA,……mysql

    3.1K60
    领券