我一直在阅读这篇question及其相关文章的几个版本,虽然我最终解决了我的问题(最后在我的sql脚本上做了s/utf8mb4/utf8/g
),但我仍然不知道为什么这样可以在MySQL上运行,但不得不在MariaDB中替换搜索。
设置:
在两台机器上我创建了数据库,如:
CREATE DATABASE `test` COLLATE 'utf8mb4_general_ci'
输入脚本是一个16MB的SQL文件,大约有300个表,所有表都声明为ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED
当我尝试在MariaDb上导入此文件时,我得到:
ERROR 1071 (42000) at line 602: Specified key was too long; max key length is 767 bytes
但是我在MySQL上更改了相同的文件,并且创建了所有表格。
为了能够在MariaDB机器上执行相同操作,我需要在运行脚本之前执行前面提到的s/utf8mb4/utf8/g
。
问题的要点是:我有没有办法设置MariaDB,以便我可以以与MySQL相同的格式导入文件?
关于@Cbroe提出的duplicate,它在几个方面失败了:
1 - 它解释了MyIsam和InnoDB之间索引大小的差异(在这两种情况下我都使用InnoDB,而在MySQL中它可以在MariaDB中失败)。
2 - 如果可能的话,它没有解释如何使MariaDB像MySQL一样运行。既然这个脚本可以使用这个引擎并且这个编码可以在MySQL上运行,那么在MariaDB中是否可以这样做呢?如果没有,为什么不呢?
此外,我们已经有了一个与所谓的副本中的答案截然不同的工作答案。
答案 0 :(得分:4)
要启用对大键的支持,您必须启用系统变量innodb_large_prefix
:
启用此选项后,对于使用DYNAMIC或COMPRESSED行格式的InnoDB表,允许长度超过767字节(最多3072字节)的索引键前缀。有关各种设置下索引键前缀的最大值,请参见第14.8.1.7节“InnoDB表的限制”。
考虑到这一点:
Permitted Values (<= 5.7.6) Type boolean Default OFF Permitted Values (>= 5.7.7) Type boolean Default ON
Data Type: boolean Default Value: ON (>= MariaDB 10.2.2) OFF (<= MariaDB 10.2.1)
因此,在MariaDB配置中设置该值(您还需要使用正确的row_format,innodb_file_format并启用innodb_file_per_table)。
答案 1 :(得分:2)
“767”问题有5种解决方法:
⚈ Upgrade to 5.7.7 (MariaDB 10.2.x) for 3072 byte limit -- your host provider may not provide this;
⚈ Change 255 to 191 on the VARCHAR -- you lose any keys longer than 191 characters (unlikely?);
⚈ ALTER .. CONVERT TO utf8 -- you lose Emoji and some of Chinese;
⚈ Use a "prefix" index -- you lose some of the performance benefits;
⚈ Reconfigure (if staying with 5.6.3 (10.1.x) - 5.7.6) -- 4 things to change: Barracuda + innodb_file_per_table + innodb_large_prefix + dynamic or compressed.
答案 2 :(得分:0)
补充@Solarflare answer:
除启用console.log(statTs.mtime)
外,还必须将innodb_file_format
设置为innodb_large_prefix
。
This文章解释了MariaDB用于InnoDB的格式,并提供了有关版本和兼容性的更多详细信息。