当前位置: 首页 > 知识库问答 >
问题:

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

云令
2023-03-14

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

Schema::defaultStringLength(191);

我试过:如果192,错了。191,好的。在此之后,我还编辑database\migrations\xxx\u user\u table.php
更改此设置

$table->string('name');

要成为

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

然后运行php工匠迁移,就可以了。使用一些mysql工具查看用户表的模式,名称的长度是varchar实际上是255,其他列是191。

我看到了这些文章
@https://laravel-news.com/laravel-5-4-key-too-long-error
@Laravel migration:unique key太长,即使指定了
@https://github.com/laravel/framework/issues/17508
@https://laravel.com/docs/master/migrations#creating-索引

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

索引键前缀长度限制为767字节,适用于使用REDUNDANT或COMPACT行格式的InnoDB表。例如,如果TEXT或VARCHAR列的列前缀索引超过255个字符,则可能会达到此限制,假设utf8mb3字符集和每个字符最多3个字节。

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

共有1个答案

黄泰宁
2023-03-14

关键是Laravel 5.4默认为utf8mb4,因此数据库假设每个字符最多有4个字节。

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

你举的例子如果更新为utf8mb4,就会完美地排列起来。重点添加在编辑的地方。

对于使用冗余或紧凑行格式的InnoDB表,索引键前缀长度限制为767字节。例如,如果TEXT或VARCHAR列上的列前缀索引超过191个字符,则可能会达到此限制,假定为utf8mb4字符集,每个字符最多4个字节。

  • 191*4=764(作品)

utf8mb4引入了对辅助字符的支持,这些字符不是utf8的一部分,其中包括表情符号。要进一步了解您是否需要utf8mb4,您可以从这个问题的StackOverflow答案开始。

如果需要保持较大的字段大小,最快的修复方法是将默认值改为utf8。Laravel 5.3及以下版本默认为utf8,在大多数情况下使用该版本是安全的。

'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

或者,您可以在创建该表时在DB迁移中的特定表上设置charset归类。看起来像这样:

Schema::create('monitors', function (Blueprint $table) {
    $table->charset = 'utf8';
    $table->collation = 'utf8_unicode_ci';

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

这个答案应该是一个很好的起点。它讨论了设置innodb\u large\u prefix以允许更长的密钥长度。

 类似资料:
  • 我已经编写了一个MySQL脚本,为假设的医院记录创建一个数据库,并用数据填充它。其中一个表Department有一个名为Description的列,该列声明为varchar(200)类型。对Description I执行INSERT命令时,出现错误: 错误1406:数据对于第1行的列“描述”来说太长。 我插入的所有字符串都小于150个字符。 以下是声明:< br > 下面是插入命令: 显然,这应该

  • 问题内容: 我无法在上创建索引。 MySQL: 问题答案:

  • 问题内容: 当我执行以下命令时: 我收到此错误消息: 有关column1和column2的信息: 我认为只需要21个字节,而只需要501个字节。因此,总字节数是522,少于767。那么为什么收到错误消息? 问题答案: 在MySQL版本5.6(及更早版本)中,InnoDB表的前缀限制为767个字节。MyISAM表的长度为1,000字节。在MySQL 5.7及更高版本中,此限制已增加到3072字节。

  • 从我的应用程序注册表单中,我试图将复选框值插入到mysql表中,但它抛出错误1406 Data对于列来说太长了。复选框的值为 0 或 1。而我的表结构是,创建表测试(checkbox_response位(1))... 我经历了一些事情,找到了解决这个问题的方法。解决方案是,我刚刚更改了sql模式SET@@global。sql_mode=“”…正确插入后。 虽然“我的数据类型大小”适合复选框值,但为

  • 问题内容: 我知道有关此标题的问题已经回答过,但是请继续阅读。发布前,我已彻底阅读了关于此错误的所有其他问题/答案。 我收到以下查询的上述错误: 有谁知道为什么以及如何解决它?问题是-相同的查询在我的本地计算机上运行完美,在我以前的主机上也运行良好。顺便说一句,它来自一个成熟的项目- phpdevshell-所以我猜这些家伙知道他们在做什么,尽管你永远都不知道。 任何线索表示赞赏。 我正在使用ph

  • 我正在尝试迁移Laravel中的一个users表。当我运行迁移时,我会得到以下错误: [Illuminate\Database\QueryException]SQLState[42000]:语法错误或访问冲突:1071指定的键太长;最大密钥长度为767字节(SQL:alter tableadd unique users_email_uniq())