如果你的MySQL版本低于5.7.7或是低于MariaDB版本低于10.2.2的,执行php artisan migrate报错,这时你应该会看到这个报错信息:1
PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes")
打开config/database.php可以看到,laravel自5.4起默认是使用utf8mb4字符编码,该编码支持对 “emojis” 表情在数据库进行存储。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15'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', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4', ## 就是这!! 字符集已改用utf8mb4了
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
],
解决办法
手动配置迁移生成的默认字符串长度,以便MySQL为它们创建索引。
打开app/Providers/AppServiceProvider.php,编辑boot方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29<?php
namespace App\Providers;
use Illuminate\Support\Facades\Schema; // 别忘了这一行!
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191); // 设置默认的字符串长度
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
参考文档:https://laravel.com/docs/master/migrations#creating-indexes