O Laravel a partir da versão a 5.4 passou a utilizar o conjunto de caracteres utf8mb4 por padrão. Esse conjunto de caracteres dá suporte ao armazenamento de emojis. Se você está utilizando uma versão do MySql superior a versão 5.77 ou uma versão do MariaDB superior a versão 10.2.2 você provavelmente não terá problemas.
Contudo, se estiver utilizando uma versão mais antiga você irá deparar com a seguinte mensagem de erro quando executar o comando para criar as migrations:
[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_unique(email))
[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes
Na documentação do Laravel está descrito que você pode contornar esse erro configurando manualmente o tamanho da string padrão.
Para corrigir esse erro edite o arquivo AppServiceProvider.php
localizado em
app/Providers/AppServiceProvider.php
.
Inclua a declaração use Illuminate\Support\Facades\Schema
. Além disso, dentro do método boot adicione Schema::defaultStringLength(191);
.
Tudo bem, mas por que tem que ser 191 caracteres?
Se você acessar o arquivo localizado em vendor/laravel/framework/src/Illuminate/Database/Schema/Builder.php
e buscar defaultStringLength
encontrará que o tamanho padrão das strings é 255.
Sendo assim, defaultStringLength(191) significa que quando não houver o tamanho dos caracteres configurado em campos VARCHAR ou do tipo CHAR será assumido o tamanho padrão 191.
Se você usa utf8mb4, cada caractere de um campo CHAR ou VARCHAR reserva 4 bytes. Portanto, 191 caracteres vezes 4 bytes é igual 764 bytes. Então, o erro que acontece porque o tamanho máximo aceito é 767 bytes. Logo, 191 caracteres não vai estourar o limite máximo de 767 bytes.
Por fim, a classe irá ficar da seguinte forma:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; class AppServiceProvider extends ServiceProvider { public function boot() { Schema::defaultStringLength(191); } }Durante a tentativa de criar as migrations pode ter acontecido de criar alguma tabela no banco de dados. Então apague as tabelas no banco para depois efetuar algum comando.
Então agora tudo vai fica bem, você pode rodar suas migrations sem problemas. Sendo assim, se surgir qualquer dúvida sobre o assunto comente aqui em baixo. Por fim agradeço pela sua atenção, e até a próxima.
Deixe uma resposta