我正在使用symfony4和flex,并试图用knp实验室-条令行为制作一些翻译表,但是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 App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
/**
* @ORM\Table(name="app_menu_trans")
* @ORM\Entity
*/
class MenuTranslation
{
use ORMBehaviors\Translatable\Translation;
/**
* @var string
*
* @ORM\Column(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;
}
}
1条答案
按热度按时间ct3nt3jp1#
767错误的5种解决方法:http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes
如果因为尝试使用字符集utf8mb4而达到限制。然后执行以下操作之一(每个操作都有缺点)以避免错误:
或者。。。继续使用5.6/5.5/10.1,但执行4个步骤将限制提高到3072字节: