gpt4 book ai didi

laravel 5.4 指定的key太长,为什么数字191

转载 作者:行者123 更新时间:2023-12-04 02:38:31 29 4
gpt4 key购买 nike

我知道这个问题已被讨论,解决或关闭。
但是我想问的是,为什么是191这个数字?

Schema::defaultStringLength(191);

我试过:如果192,错了。 191,好的。
在此之后,我还编辑 database\migrations\xxx_user_table.php
改变这个
$table->string('name');

成为
$table->string('name', 255);

然后运行php artisan migrate,就ok了。
使用一些mysql工具查看用户表的架构,
varchar 的名称长度实际上是 255,其他列是 191。

我看到了这些文章
@ https://laravel-news.com/laravel-5-4-key-too-long-error
@ Laravel migration: unique key is too long, even if specified
@ https://github.com/laravel/framework/issues/17508
@ https://laravel.com/docs/master/migrations#creating-indexes

还有这个:
@ https://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html

The index key prefix length limit is 767 bytes for InnoDB tables that use the REDUNDANT or COMPACT row format. For example, you might hit this limit with a column prefix index of more than 255 characters on a TEXT or VARCHAR column, assuming a utf8mb3 character set and the maximum of 3 bytes for each character.



但是为什么名称的长度为 255 是可以的?
而192*3 = 576,小于767,为什么192不行?

最佳答案

为什么限制为 191 个字符?

关键是 Laravel 5.4 defaults to utf8mb4 因此数据库假定每个字符最多 4 个字节。

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

如果为 utf8mb4 更新,您引用的示例完美排列。 重点添加到编辑位置。

The index key prefix length limit is 767 bytes for InnoDB tables that use the REDUNDANT or COMPACT row format. For example, you might hit this limit with a column prefix index of more than 191 characters on a TEXT or VARCHAR column, assuming a utf8mb4 character set and the maximum of 4 bytes for each character.


  • 191 * 4 = 764 (作品)
  • 192 * 4 = 768 (太大)
  • utf8mb4引入了对 Supplementary Characters 的支持不属于 utf8 的其中包括表情符号。进一步阅读您是否需要 utf8mb4 ,您可以从 this StackOverflow answer on the question 开始.

    我该如何解决?

    如果您需要保持较大的字段大小,最快的解决方法是将默认值更改为 utf8。 . Laravel 5.3 and below defaulted utf8 , and that would be safe to use in most cases.
    'charset' => 'utf8',
    'collation' => 'utf8_unicode_ci',

    或者,您可以 set the charset and collation on specific tables in the DB Migration when creating that table .看起来像这样:
    Schema::create('monitors', function (Blueprint $table) {
    $table->charset = 'utf8';
    $table->collation = 'utf8_unicode_ci';

    $table->increments('id');
    $table->string('myString')->unique();
    });

    如果我需要 utf8mb4和长索引键?

    This StackOverflow answer应该是一个很好的起点。它讨论设置 innodb_large_prefix允许更长的 key 长度。

    关于laravel 5.4 指定的key太长,为什么数字191,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43832166/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com