mariadb上的条令行为可翻译索引标识符太长



我使用带有flex的Symfony 4,并试图用KNP Labs-Doctrine Behaviors制作一些翻译表,但Symfony自动生成的索引名称对MariaDb来说太长了。至少我从错误中理解了这一点:

在AbstractMySQLDriver.php中第125行:

执行时发生异常

CREATE TABLE app_menu_trans (
id INT AUTO_INCREMENT NOT NULL, 
translatable_id INT DEFAULT NULL, 
name VARCHAR(255 ) NOT NULL, 
locale VARCHAR(255) NOT NULL, 
INDEX IDX_B79696A62C2AC5D3 (trans latable_id), 
UNIQUE INDEX app_menu_trans_unique_translation (translatable_id, locale), 
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_  

SQLSTATE[42000]:语法错误或访问冲突:指定了1071钥匙太长了;最大密钥长度为767字节

在PDOConnection.php第109行:

SQLSTATE[42000]:语法错误或访问冲突:指定了1071钥匙太长了;最大密钥长度为767字节

在PDOConnection.php第107行:

SQLSTATE[42000]:语法错误或访问冲突:指定了1071钥匙太长了;最大密钥长度为767字节

这里有点可疑,因为MariaDb规范说:

数据库、表、列、索引、约束、存储例程,触发器、事件、视图、表空间、服务器和日志文件组具有最大长度为64个字符。

我还不够高级,无法理解哪里出了问题以及如何解决问题。
下面是我的翻译表类:

namespace AppEntity;

use DoctrineORMMapping as ORM;
use KnpDoctrineBehaviorsModel as ORMBehaviors;
/**
* @ORMTable(name="app_menu_trans")
* @ORMEntity
*/
class MenuTranslation
{
use ORMBehaviorsTranslatableTranslation;
/**
* @var string
*
* @ORMColumn(type="string", length=255)
*/
private $name;
/**
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @param string $name
*
* @return MenuTranslationTranslation
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
}

767错误的5种解决方法:http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes

如果您因为尝试使用CHARACTER SET utf8mb4而达到限制。然后执行以下操作之一(每个操作都有缺点(以避免错误:

⚈  Upgrade to 5.7.7 for 3072 byte limit -- your cloud may not provide this; 
⚈  Change 255 to 191 on the VARCHAR -- you lose any values longer than 191 characters; 
⚈  ALTER .. CONVERT TO utf8 -- you lose Emoji and some of Chinese; 
⚈  Use a "prefix" index -- you lose some of the performance benefits. 

或者。。。保留5.6/5.5/10.1,但执行4个步骤将限制提高到3072字节:

SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_large_prefix=1;
logout & login (to get the global values);
ALTER TABLE tbl ROW_FORMAT=DYNAMIC;  -- (or COMPRESSED)

相关内容

  • 没有找到相关文章

最新更新