一 问题层面
先从今天在项目当中遇到的一个问题开始:
项目采用的flask_sqlalchemy ,因为需求的原因,在model层加了一个包含两个field的uniqueConstrain,在数据库间库的时候遇到了一个问题:
Specified Key was too long:max key length is 767 bytes
翻译就是 个别field太长了,超过了767byte的限制
二 原因层面
1
之前普通field从未报过此种错误,原因肯定是加了uc,众所周知,加了uc是有索引的,因为涉及了索引
2
inodb对索引长度是有限制的,但是限制长度是255字节啊,为什么还是报错了?
"Prefixes can be up to 255 bytes long (or 1000 bytes for MyISAM and InnoDB tables as of MySQL
4.1.2). Note that prefix limits are measured in bytes, whereas the prefix length in CREATE INDEX
statements is interpreted as number of characters. Take this into account when specifying a
prefix length for a column that uses a multi-byte character set."
3
uc的索引长度应该是创建UC的field长度之和
三 原理层面
那么为什么索引要加一个最长字符的限制呢,从索引的实现层面来讲,不管多长的索引按理我都可以排序放到B/B+_树中?
十分费解