Loading...

Gérer l'erreur Laravel MySQL Specified key was too long

Résoudre l'erreur PDO de MySQL "SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long" lors de l'installation Laravel
Gérer l'erreur Laravel MySQL Specified key was too long

Gérer l'erreur Laravel MySQL Specified key was too long

Catégorie : WEB

Gérer l'erreur Laravel "Specified key was too long" avec la base de donnée MySQL

Vous installez Laravel ou Voyager sur votre poste local ou un serveur et êtes confrontés à l'erreur PDO "SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long".
Pas de panique ! Pour gérer ce problème lié à MySQL, il y a 2 solutions différentes. La première dans le paramétrage de la connexion MySQL, l'autre dans le fichier "AppServiceProvider.php".

Configuration MySQL dans le fichier database.php

Tout d'abord, l'encodage définit par défaut utf8mb4, nous allons préférer utiliser l'encodage classique utf8. Dans le fichier "database.php", situé à l'emplacement "config", vous trouverez un bloc de paramétrage pour la base MySQL (vers la ligne 46 du fichier), remplacez dans les deux lignes la valeur. Tel que ci-dessous :

'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

Ensuite, le moteur de base de donnée n'est pas définit, c'est donc celui par défaut qui servira à la création des tables. L'erreur "SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long" peut être générée à cause du moteur MyISAM, dans la ligne "engine", entrez la valeur "InnoDB". Ce moteur sera donc utilisé pour toutes les créations de tables.

'engine' => 'InnoDB',

La partie MySQL du fichier de configuration database.php (situé entre la ligne 46 et 64) doit donc ressembler à cet extrait de code :

'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            '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' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => 'InnoDB',
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

Configuration de AppServiceProvider.php

Dernière solution au problème "Key was too long", choisir une taille de colonne String par défaut, dans ce fichier, il faut alors attribuer la longueur 191 à ce paramètre. Vous devez éditer le fichier "AppServiceProvider.php", il se situe à l'emplacement "app / Providers / AppServiceProvider.php".

namespace AppProviders;

use Illuminate\Support\Service\Provider;
use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191);
    }
}

J'espère que ces quelques lignes de code vous débloqueront pour votre installation / migration de Laravel avec MySQL. Si votre problème "Specified key was too long" n'est pas résolue, vous pouvez demander de l'aide à la communauté Laravel sur Laracast Discussions.