我知道这个问题被讨论,解决或关闭。
但我想问的是,为什么数字是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不可以?
关键是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())