20191011-MySQL建索引的强约束

问题:

[42000][1071] Specified key was too long; max key length is 3072 bytes
[42000][1071] Specified key was too long; max key length is 767 bytes

创建表出现上述错的原因是什么?

正文:

Utf8 1~3byte=1字符;Utf8mb4 1~4byte=1字符

mysql 从5.7.17 默认是严格模式,单个列的索引长度不能超过767byte==255.5位(推荐varchar(255)的原因),
启用innodb_large_prefix选项,就可以将单个列约束项扩展至3072byte,
非严格模式下非唯一索引的建立将不会报错,而是自动截取。
联合索引长度不能超过3072byte(在innodb_large_prefix=off也一样),非严格也是自动截取。

为什么是3072 ?

InnoDB一个page的默认大小是16k。由于是Btree组织,
要求叶子节点上一个page至少要包含两条记录(否则就退化链表了)。
所以一个记录最多不能超过8k。又由于InnoDB的聚簇索引结构,
一个二级索引要包含主键索引,因此每个单个索引不能超过4k (极端情况,pk和某个二级索引都达到这个限制)。
由于需要预留和辅助空间,扣掉后不能超过3500,取个“整数”就是(1024*3)。 

如何超越3072 ?

MySQL 索引只支持767个字节,utf8mb4 每个字符占用4个字节,
所以索引最大长度只能为191个字符,即varchar(191),若想要使用更大的字段,
mysql需要设置成支持数据压缩,并且修改表属性 row_format ={DYNAMIC|COMPRESSED}

MySQL中sql mode 中STRICT_ALL_TABLES和STRICT_TRANS_TABLES的区别

只要有他们就是严格模式。默认都是严格模式。

对于事务表,当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式时,
如果语句中有非法或丢失值,则会出现错误。语句被放弃并滚动。

对于非事务表,如果插入或更新的第1行出现坏值,两种模式的行为相同。
语句被放弃,表保持不变。如果语句插入或修改多行,并且坏值出现在第2或后面的
行,结果取决于启用了哪个严格选项:

对于STRICT_ALL_TABLES,MySQL返回错误并忽视剩余的行。但是,在这种情况
下,前面的行已经被插入或更新。这说明你可以部分更新,这可能不是你想要的。要
避免这点,最好使用单行语句,因为这样可以不更改表即可以放弃。


 对于STRICT_TRANS_TABLES,MySQL将非法值转换为最接近该列的合法值并插入
调整后的值。如果值丢失,MySQL在列中插入隐式 默认值。在任何情况下,MySQL
都会生成警告而不是给出错误并继续执行语句。

mysql row_format 说明

在 msyql 5.7.9 及以后版本,默认行格式由innodb_default_row_format变量决定,它
的默认值是DYNAMIC,也可以在 create table 的时候指定
ROW_FORMAT=DYNAMIC。用户可以通过命令 SHOW TABLE STATUS 
LIKE'table_name' 来查看当前表使用的行格式,其中 row_format 列表示当前所使用的行记录结构类型。

ROW_FORMAT

命令:

show variables like 'sql_mode'; //查看sql mode
select version(); //
show variables like 'innodb_large_prefix'; //
show table status like  'book_info_22'; //查看row_format
set global innodb_large_prefix=1;
set global innodb_file_format=BARRACUDA

参考:官方文档

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容