当我运行一个与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
是否存在问题。
无论如何,有没有人知道如何解决这个问题?
答案 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'
答案 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)
我有同样的错误但是在另一个问题上。导入数据(数据和架构)脚本时出现此错误。删除唯一索引为我解决了这个问题。