Php mariadb上的可翻译索引标识符太长
我将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个字符 我没有足够的能力去理解什么是错误的,以及如何避免错误。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字节
我的翻译表类如下:
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)