MySQL错误:最大列大小为767字节

时间:2015-06-10 16:15:55

标签: mysql database size innodb mysql-workbench

当我运行一个与MySQL有关的程序时,我收到了以下错误消息:

  

2015-06-10 15:41:12,250 ERROR app.wsutils 419 INCRON:错误:('HY000',   '[HY000] [MySQL] [ODBC 5.2(w)驱动程序] [mysqld-5.7.7-rc-log]索引列   尺寸太大了。最大列大小为767字节。 (1709)   (SQLExecDirectW)')

我用Google搜索了一下,发现此错误可能与innodb_large_prefix选项有关。但是,我使用的是MySQL 5.7.7 rc,它已经将innodb_large_prefix设置为“ON”(在MySQL Workbench中检查),允许最多3072个字节。我不确定这是innodb_large_prefix是否存在问题。

无论如何,有没有人知道如何解决这个问题?

11 个答案:

答案 0 :(得分:15)

您尝试编制索引的列太大,innodb_large_prefix的设置不能正确。还需要设置几个prerequisites参数才能使innodb_large_prefix正常工作。

您可以检查以确保通过运行来设置innodb_large_prefix

show global variables like 'innodb_lar%';

以下是使用innodb_large_prefix的几个先决条件:

您需要设置全局变量innodb_file_format = BARRACUDA

检查设置运行:show global variables like 'innodb_fil%';

在表级别你必须使用ROW_FORMAT = DYNAMIC或ROW_FORMAT = COMPRESSED

对于Innodb

默认情况下,行以COMPACT格式(ROW_FORMAT = COMPACT)存储。

答案 1 :(得分:14)

借助BK435给出的答案,我做了以下工作并解决了问题。

set global innodb_file_format = BARRACUDA;
set global innodb_large_prefix = ON;
create table test (........) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

答案 2 :(得分:0)

尽管innodb_large_prefix配置正确,但我遇到了同样的错误。

问题在于使用整理。我的数据库的默认排序规则设置为utf8mb4_bin(您可以在phpmyadmin“Operations”选项卡中查看数据库)。这意味着它每个字符使用4个字节,而utf8整理(例如utf8_unicode_ci)每个字符使用3个字节。

在这种情况下,您可以使用不同的排序规则,例如通过在DEFAULT CHARSET=utf8语句的末尾添加CREATE TABLE,或仅使用列值的一部分来限制索引大小 比如KEY 'identifier' (column1(5),column2(10))

另见相关问题:#1071 - Specified key was too long; max key length is 767 bytes

答案 3 :(得分:0)

在我的情况下(MySQL版本5.6),问题是我试图创建一个表,该表的列最多可以包含256个字符(数据库使用utf8归类),因此每1个utf8字符3个字节= 256 * 3 = 768字节。解决方法是仅使用255个字符而不是256个字符。

我也可以像其他人建议的那样设置innodb_large_prefix,但是在我的情况下,减少符号数量会更容易。

答案 4 :(得分:0)

我遇到了这个问题,因为我试图用varchar(254)创建一个String主键。有时候容易被忽略。所以还要仔细检查您的索引类型和长度:)

答案 5 :(得分:0)

我使用的是MariaDB 10.1.38版,并使用了以下所有给定的命令,但是它不起作用-

set global innodb_large_prefix = ON;
Query OK, 0 rows affected (0.00 sec)

set global innodb_file_per_table = ON;
Query OK, 0 rows affected (0.00 sec)

set global innodb_file_format = Barracuda;
Query OK, 0 rows affected (0.00 sec)

SET GLOBAL innodb_default_row_format = 'DYNAMIC';

因为重新启动MySQL(或MariaDB)后,这些设置将不会在mysql提示符下使用以下命令反映出来:显示变量,例如'innodb%';

然后我编辑了My.ini,并将这些设置添加到了以下位置的文件中- C:\ xampp \ mysql \ bin \ my.ini

## Innodb settings to bypass error of max size 737
innodb-file-format=barracuda
innodb-file-per-table=ON
innodb-large-prefix=ON
## Above 3 didnot work so i added below
innodb_default_row_format = 'DYNAMIC'

来源:https://www.experts-exchange.com/questions/28675824/Why-am-I-unable-to-turn-innodb-large-prefix-ON-successfully-Every-time-I-reboot-mySql-on-my-Ubuntu-VPS-it-resets-to-OFF.html

答案 6 :(得分:0)

对我来说,使用Mariadb 10.1.31,只需在登录Mysql CLI时添加即可:

SET GLOBAL innodb_file_format = Barracuda;

SET GLOBAL innodb_file_per_table = ON;

SET GLOBAL innodb_large_prefix = ON;

SET GLOBAL innodb_default_row_format = 'DYNAMIC';

答案 7 :(得分:0)

如果有人使用 MySQL 5.6,我发现的唯一解决方案是更新到 MySQL 5.7 并按照之前的评论 (https://stackoverflow.com/a/57465002/2300390) 中所述设置 my.cnf

答案 8 :(得分:-1)

只需将以下选项添加到my.cnf

即可
[mysqld]
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix

然后,重启mysql服务器问题将得到解决。

答案 9 :(得分:-2)

设置以下系统变量:

innodb_buffer_pool_size.................................... 702545920
innodb_file_format......................................... Barracuda
innodb_file_format_check................................... ON
innodb_file_format_max..................................... Barracuda
innodb_file_per_table...................................... ON
innodb_large_prefix........................................ ON
innodb_log_file_size....................................... 50331648

此外,请确保在创建架构时将其创建为 Latin1 。这就是我最终解决的问题。

答案 10 :(得分:-2)

我有同样的错误但是在另一个问题上。导入数据(数据和架构)脚本时出现此错误。删除唯一索引为我解决了这个问题。

摘自this link