Php mariadb上的可翻译索引标识符太长

Php mariadb上的可翻译索引标识符太长,php,mysql,symfony,doctrine-orm,mariadb,Php,Mysql,Symfony,Doctrine Orm,Mariadb,我将Symfony 4与flex一起使用,并尝试使用创建一些翻译表,但Symfony自动生成的索引名对于MariaDb来说太长。至少我从错误中理解了这一点: 在AbstractMySQLDriver.php第125行中: 执行时发生异常 SQLSTATE[42000]:语法错误或访问冲突:指定了1071 钥匙太长了;最大密钥长度为767字节 在PDOConnection.php第109行中: SQLSTATE[42000]:语法错误或访问冲突:指定了1071 钥匙太长了;最大密钥长度为767字节

我将Symfony 4与flex一起使用,并尝试使用创建一些翻译表,但Symfony自动生成的索引名对于MariaDb来说太长。至少我从错误中理解了这一点:

在AbstractMySQLDriver.php第125行中:

执行时发生异常

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;
    }
}

767错误的5个解决方法:

如果由于尝试使用字符集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)

我现在没有时间,但简短的解释是,使用
utf8mb4
最大长度限制为191个字符。搜索一下,你会发现很多关于这方面的帖子,如果我记得清楚的话,这应该已经在mysql的最新版本中修复了。@rickjamesgood!我不明白你为什么提到我,但鉴于你的声誉,你应该知道你应该避免只在答案中直接添加主要细节的链接,对吗?:-)(链接仅供参考,可能会随着时间的推移而改变)。@gp\u sflover-是的,我因为只提供链接的答案而受到惩罚。但是我的30多个博客主要是为了提供这样的答案,所以我可以更快地进入下一个问题。甲骨文在排除我的博客方面做得很好。这个特殊的版本被5.7“消除”,但我为那些没有升级的人保留它。(不管怎样,我都会把它们放在周围。)或者只要把
locale
length改成191,如果可以的话。@ukaszJakubek-这是第二个项目符号。
   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)