如何修复MySql:索引列大小太大(Laravel migrate)

Sve*_*len 16 mysql indexing vagrant laravel-5

我复制了一个带有流浪盒的项目,它安装了Debian,Nginx,PhpMyAdmin,..随着新项目,Laravel php artisan migrate不再工作,我得到错误:

[Illuminate\Database\QueryException]                                                                                                                                      
  SQLSTATE[HY000]: General error: 1709 Index column size too large. The maximum column size is 767 bytes. (SQL: alter table `courses` add unique `courses_name_unique`(`na  
  me`))
Run Code Online (Sandbox Code Playgroud)

当我创建工作项目数据库的转储(结构+数据)并将其导入数据库时​​给出迁移时的错误,然后一切正常,它创建所有表和数据导入..

如何修复大小以便我可以运行migrate方法?

Pau*_*gel 40

正如您在错误消息中看到的那样 - "最大列大小为767字节",如果要在其上创建索引.一VARCHAR(255)列可使用最多765(255*3)字节,使用utf81020(255*4)字节utf8mb4.这是因为在MySQL utf8中最多需要3个字节,utf8mb4最多4个字节(真正的UTF8).因此,创建VARCHAR(255)(唯一)索引utf8mb4将失败.

这是解决问题的方法:

设置默认排序规则my.ini:

collation_server=utf8_unicode_ci
character_set_server=utf8
Run Code Online (Sandbox Code Playgroud)

创建时为数据库设置默认排序规则:

CREATE DATABASE IF NOT EXISTS `your_db` COLLATE 'utf8_unicode_ci'
Run Code Online (Sandbox Code Playgroud)

设置表/列的默认排序规则.(我不推荐)

将列大小更改为190(varchar(190))或更小.

Laravel 5.4修复

Laravel的迁移命令覆盖了Mysql服务器配置.它会将排序规则和字符集设置为配置的版本.

更改位于的数据库配置文件中的字段charsetcollation数据库引擎config/database.php.

..
'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            //'charset' => 'utf8mb4',
            //'collation' => 'utf8mb4_unicode_ci',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
..
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以按照这个更好的答案:/sf/ask/1665045161/#39750202 (3认同)

Pra*_*tik 11

对于mariadb,请*my.cnf使用以下配置更新文件,

innodb_default_row_format=dynamic
innodb_file_format=barracuda
innodb_file_per_table=true
innodb_large_prefix=true
Run Code Online (Sandbox Code Playgroud)

然后,您必须重新启动mariadb服务以使更新的配置生效。

  • 这不行!!我添加了这些行,然后我的 mariadb 停止工作了! (2认同)

gta*_*ero 7

对于 Laravel 5.5 或更高版本,将 config/database.php 文件引擎更改为 InnoDB ROW_FORMAT=DYNAMIC:

'connections' => [
    ...
    'mysql' => [
        ...
        'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
 ]]
Run Code Online (Sandbox Code Playgroud)

感谢 laracasts:https://laracasts.com/discuss/channels/eloquent/migrations-and-table-options-row-format


Ric*_*mes 6

三种解决方案,每种都有缺点:

  • MySQL 5.7避免了这个问题。考虑升级。

  • VARCHAR(255)通常var大于必要值。如果您可以安全地缩小到191以下,错误将消失。

  • 如果不需要中文或表情符号,请切换到utf8(来自utf8mb4)。


小智 6

在 中App\Providers\AppServiceProvider.php,导入Schema

use Illuminate\Support\Facades\Schema;
Run Code Online (Sandbox Code Playgroud)

并在boot()函数中添加这一行:

Schema::defaultStringLength(191);
Run Code Online (Sandbox Code Playgroud)