我使用带有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)