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

ukxgm1gy  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(289)

我正在使用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;
    }
}
ct3nt3jp

ct3nt3jp1#

767错误的5种解决方法:http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes
如果因为尝试使用字符集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)

相关问题