|
|
1
16
NO_ENGINE_SUBSTITUTION已禁用,INNODB未激活,组合不正确
根据MySql文档(请参阅 https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sqlmode_no_engine_substitution )这就是sqlmode NO_ENGINE_SUBSTITION的含义:
证明MySql 5.1.56版社区 案例1:
案例2:
案例3:
要复制测试,请在my.cnf中每次更改后重新启动MySql。 由于MySql 5.6版本的sqlmode默认情况下不再为空,并且包含no_ENGINE_SUBSTITUTION,而且INNODB是默认引擎,因此很难满足错误。 其他测试没有其他再现错误的方法:
在尝试创建INNODB表时发现。 在INNODB中,您有两种错误1071:
这与innodb_large_prefix ON或OFF无关,只与用作索引的单个VARCHAR列的大小有关。 Mysql存储varchar utf8,其中3个字节加上1个字节,长度最多为255个字符,后面2个字符(请参阅: http://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html ),因此,如果您尝试使用VARCHAR(256)utf8设置密钥,则会得到:
您会得到前面的错误,因为对于InnoDB表,单列的最大键长度是767字节。VARCHAR(255)是可以的,因为:
我在四个Mysql版本5.1.56、5.5.33、5.6和5.7上测试了它,这一点得到了证实。使用VARCHAR(255)查询没有问题,使用VARCHAR(256)查询有问题:
正如你所看到的,这条消息是不同的,因为它是INNODB消息,而不是MYISAM消息! INNODB表的错误1071的另一种类型是:
这与具有多列的键有关。对于那些要启用的密钥,您需要将innodb_large_prefix设置为on。 无论如何,如果您尝试运行这样的程序:
使用5个VARCHAR(255)utf8列的键,即3830个字节,您将运行到:
奇异假说在寻找原因的过程中,我提出并测试了不同的、非常奇怪的假设: ROW格式测试REDUNDANT、COMPACT、COMPRESS、DYNAMIC:语句对表的创建没有影响。 FILE格式经过测试的羚羊和梭鱼:您的声明对表的创建没有影响。 MySql已生成测试了32位和64位MySql:语句对表创建没有影响。 其他类似故障在这里,您可以在相同的情况下找到相同的错误: https://www.drupal.org/node/2466287 我在PROOF中列出的3种测试情况中测试了该声明,它再现了与你完全相同的行为,所以我可以说问题是相同的。在这种情况下,他们切换到其他数据库,但问题是设置的混合,而不是数据库版本。 参考文献这里给出了一篇关于INNODB索引的非常好的文章: http://mechanics.flite.com/blog/2014/07/29/using-innodb-large-prefix-to-avoid-error-1071/ 警告:在创建索引超过1000的INNODB表后,通过在my.cnf中取消注释skip INNODB来禁用INNODB将不允许启动MySql服务 当做 |
|
|
2
3
我现在不知道你有多大的灵活性,但这里有一些选择:
除了这些选项之外,您几乎陷入了困境,因为MySQL中没有可以更改的设置来启用大于1000字节的索引键。 |
|
|
3
3
在MySQL 5.6.3+中,有一些限制(需要
|
|
|
4
2
你(意外地?)关闭了InnoDB。它正在将表创建为MyISAM 全部的 密钥超过1000字节。
检查是否有InnoDB的变量,以及是否存在“no_engine_substitution”(如果早在5.1.56中就存在)也要检查
|
|
|
5
1
它似乎与存储引擎有关。我的最终用户正在使用
|
|
|
6
1
正如所说,你的索引的总长度太长了。
简单的答案是,你不应该索引这么长
最好的做法是使用前缀索引,这样您就只对数据的左子串进行索引。无论如何,您的大部分数据都将比255个字符短得多。
767字节是规定的前缀限制
根据对此问题的响应,您可以通过指定列的子集而不是整个数量来获得要应用的键。意味着您可以在定义索引时声明每列的前缀长度。 例如:
下面的例子可以更清楚地解释它:我创建了一个表,并在其中插入了一些数据。
但是,给定列的最佳前缀长度是多少?以下是一种查找方法:
这告诉您80%的字符串少于20个字符,并且所有字符串都少于50个字符。因此,不需要索引超过50的前缀长度,当然也不需要索引255个字符的完整长度。 根据需要进行调整以获得应用密钥,但我想知道是否值得查看您关于该实体的数据模型,看看是否有改进可以让您在不受MySQL限制的情况下实现预期的业务规则。 关于innodb中的设置,可以在 http://mechanics.flite.com/blog/2014/07/29/using-innodb-large-prefix-to-avoid-error-1071/ |
|
|
7
0
正式文件5.6限制 创新数据库 表格
http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html 这个 我的ISAM 存储引擎
http://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html 然而,您的表被声明为InnoDB。所以我不知道该怎么想 最后还有一条线索 old bug
|
|
|
8
0
最大密钥长度为1000字节。这也可以通过更改源代码和重新编译来更改。对于密钥长度超过250字节的情况,将使用比默认1024字节更大的密钥块大小。 |
|
|
9
0
在我的案例中,MySQL是在没有InnoDB支持的情况下启动的。在数据库备份导入过程中,尝试创建MyISAM表。
同时,MySQL重启期间控制台中没有显示任何错误。
顺便说一句,错误与
|
|
|
Bard.Mus · 迁移后的数据库字符集环境 1 年前 |
|
Efannnnnn · 将Id数据存储到任何页面 1 年前 |
|
|
yooooo · 用于在块中删除的存储过程-LOOP未执行 1 年前 |
|
John Beasley · 更新一定数量记录的连续日期 1 年前 |
|
|
ColinM · MySQL以前的结果查询返回不正确的值 1 年前 |
|
Sergey_Z · MySQL只需无条件连接2个表和交叉连接 1 年前 |