mariadb中的键太长了,但是同样的编码脚本在mysql上运行

时间:2017-08-22 16:20:28

标签: mysql mariadb

我一直在阅读这篇question及其相关文章的几个版本,虽然我最终解决了我的问题(最后在我的sql脚本上做了s/utf8mb4/utf8/g),但我仍然不知道为什么这样可以在MySQL上运行,但不得不在MariaDB中替换搜索。

设置:

  • 机器1:Mysql 5.7.19
  • 机器2:MariaDb 10.1.25

在两台机器上我创建了数据库,如:

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中是否可以这样做呢?如果没有,为什么不呢?

此外,我们已经有了一个与所谓的副本中的答案截然不同的工作答案。

3 个答案:

答案 0 :(得分:4)

要启用对大键的支持,您必须启用系统变量innodb_large_prefix

  

启用此选项后,对于使用DYNAMIC或COMPRESSED行格式的InnoDB表,允许长度超过767字节(最多3072字节)的索引键前缀。有关各种设置下索引键前缀的最大值,请参见第14.8.1.7节“InnoDB表的限制”。

考虑到这一点:

Default values for Mysql

Permitted Values (<= 5.7.6)   Type    boolean  
                              Default OFF
Permitted Values (>= 5.7.7)   Type    boolean
                              Default ON

Default values for MariaDB:

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的格式,并提供了有关版本和兼容性的更多详细信息。