laravel 5.4指定的键太长,为什么数字是191
我知道这个问题已被讨论、解决或解决。laravel 5.4指定的键太长,为什么数字是191,laravel,Laravel,我知道这个问题已被讨论、解决或解决。 但我想问的是,为什么数字是191 Schema::defaultStringLength(191); 我试过:如果192,错了。191,好的。 在此之后,我还编辑了database\migrations\xxx\u user\u table.php 改变这个 $table->string('name'); 将来 然后运行php artisan迁移,就可以了。 使用一些mysql工具查看用户表的模式, 名称的长度实际上是255,其他列是191 我看到
但我想问的是,为什么数字是191
Schema::defaultStringLength(191);
我试过:如果192,错了。191,好的。
在此之后,我还编辑了database\migrations\xxx\u user\u table.php改变这个
$table->string('name');
将来
然后运行php artisan迁移,就可以了。
使用一些mysql工具查看用户表的模式,
名称的长度实际上是255,其他列是191
我看到了这些文章@
@
@
@ 这是: @ InnoDB表的索引键前缀长度限制为767字节 使用冗余或压缩行格式。例如,您可能会 此限制在列上的列前缀索引超过255个字符 TEXT或VARCHAR列,假定为utf8mb3字符集和 每个字符最多3个字节
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
但是为什么名称的长度255是可以的呢?192*3=576,小于767,为什么192不正常?为什么限制为191个字符? 关键是Laravel5.4,因此数据库假设每个字符最多有4个字节
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
如果针对utf8mb4进行了更新,那么您所引用的示例将完美匹配强调在编辑位置添加
对于使用冗余或紧凑行格式的InnoDB表,索引键前缀长度限制为767字节。例如,假设utf8mb4字符集且每个字符的最大字节数为4,则文本或VARCHAR列上的列前缀索引可能超过191个字符,从而达到此限制
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
(作品)191*4=764
(太大)192*4=768
utf8mb4
引入了对补充字符的支持,这些字符不属于utf8
,其中包括表情符号。要进一步了解是否需要utf8mb4
,可以从开始
我该如何解决这个问题?
如果需要保持较大的字段大小,最快的修复方法是将默认值改为utf8
或者,你也可以。看起来是这样的:
Schema::create('monitors', function (Blueprint $table) {
$table->charset = 'utf8';
$table->collation = 'utf8_unicode_ci';
$table->increments('id');
$table->string('myString')->unique();
});
如果我需要utf8mb4
和长索引键怎么办?
这应该是一个很好的起点。它讨论了设置innodb\u large\u prefix
以允许更长的键长度。5个变通方法,从MySQL的角度来看:只是一个澄清-utf8对于使用1-4字节表示Unicode世界中的任何字符都很好。问题是mysql的utf8实现使用了1-3个字节,这意味着无法表示非常大的块(在基本的前65K代码点之外)。