2019-10-14
자체서버에서 에러 없이 잘 개발 하던, Laravel프로젝트를 다른 서버에 옮겨서 운용하려고 하다 보면, 아래와 같은 마이그레이션 오류가 종종 뜬다.
$ php artisan migrate Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.05 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: a lter table `password_resets` add index `password_resets_email_index`(`email`)) ...
laravel은 기본적으로 "emojis"를 데이터베이스에 저장할 수 있는 utf8mb4 캐릭터셋을 사용하기 때문에 발생하는 오류이다.
참고링크: https://laravel.kr/docs/5.8/migrations#인덱스 길이 & MySQL / MariaDB

아래와 같이, app\Providers\AppServiceProvider.php에 가서 아래 구문을 추가하면 해결 된다.
물론 아래 구문을 추가하기 위해선, Schema파사드도 추가해야 한다.
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema; //추가

class AppServiceProvider extends ServiceProvider
{
	public function register()
	{
		//
	}

	public function boot()
	{
		Schema::defaultStringLength(191); //추가
	}
}

위처럼 구문을 추가하고, 다시 마이그레이션을 해보면..
$ php artisan migrate Migrating: 2014_10_12_100000_create_password_resets_table Illuminate\Database\QueryException : SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'pa ssword_resets' already exists (SQL: create table `password_resets` (`email` varchar(191) not null, `token` varchar(191) not null, `created_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ ci') ...
위와 같은 오류가 발생할 것이다.
마이그레이션을 시도 하다가 오류가 뜨는 바람에, 이미 password_resets 테이블이 있다는 오류이다.
DB 툴을 이용하여, 직접 해당 db의 모든 테이블을 지운뒤에 다시 시도하면 된다.