Search code examples
phpmysqllaravelmigrationunique-key

Laravel migration: unique key is too long, even if specified


I am trying to migrate a users table in Laravel. When I run my migration I get this error:

[Illuminate\Database\QueryException] SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_uniq(email))

my migration is as follows:

Schema::create('users', function(Blueprint $table)
{
    $table->increments('id');
    $table->string('name', 32);
    $table->string('username', 32);
    $table->string('email', 320);
    $table->string('password', 64);
    $table->string('role', 32);
    $table->string('confirmation_code');
    $table->boolean('confirmed')->default(true);
    $table->timestamps();

    $table->unique('email', 'users_email_uniq');
});

After some googling I came across this bug report where Taylor says you can specify the index key as the 2nd parameter of unique(), which I have done. It still gives the error. What is going on here?


Solution

  • Specify a smaller length for your e-mail:

    $table->string('email', 250);
    

    Which is the default, actually:

    $table->string('email');
    

    And you should be good.

    For Laravel 5.4 you can find a solution in this Laravel 5.4: Specified key was too long error, Laravel News post:

    As outlined in the Migrations guide to fix this all you have to do is edit your AppServiceProvider.php file and inside the boot method set a default string length:

    use Illuminate\Database\Schema\Builder;
    
    
    public function boot()
    {
        Builder::defaultStringLength(191);
    }