Error de migración de Laravel: error de syntax o violación de acceso: 1071 La clave especificada era demasiado larga; la longitud máxima de la clave es 767 bytes

Error de migración en Laravel 5.4 con php artisan make:auth

[Illuminate \ Database \ QueryException] SQLSTATE [42000]: error de syntax o violación de acceso: 1071 La clave especificada era demasiado larga; la longitud máxima de la clave es de 767 bytes (SQL: los users users_email_unique agregan users users_email_unique ( email ))

[PDOException] SQLSTATE [42000]: error de syntax o violación de acceso: 1071 La clave especificada era demasiado larga; la longitud máxima de la clave es 767 bytes

    El problema se resuelve de la siguiente manera.

    Agregue el siguiente código en AppServiceProvider.php

     L5_root/app/Providers/AppServiceProvider.php 

    El bloque de código

     use Illuminate\Support\Facades\Schema; //Import Schema function boot() { Schema::defaultStringLength(191); //Solved by increasing StringLength } 

    MySQL siempre reserva la cantidad máxima para un campo UTF8 que es de 4 bytes, por lo que con 255 + 255 con su JUEGO DE CARACTERES POR DEFECTO utf8mb4 COLLATE utf8mb4_unicode_ci; está por encima del límite máximo de longitud de llave 767. Por @scaisedge

    No sé por qué la solución anterior y la solución oficial que está agregando

     Schema::defaultStringLength(191); 

    en AppServiceProvider no funcionó para mí. Lo que funcionó fue editar el archivo database.php en la carpeta config . Solo edite

     'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 

    a

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

    y debería funcionar Espero eso ayude.

    En AppServiceProvider.php , incluye este código en la parte superior del archivo.

     use Illuminate\Support\Facades\Schema; 

    Y agregas este código en el método de arranque.

      Schema::defaultStringLength(191); 

    Este problema está causado en Laravel 5.4 por la versión de la base de datos.

    De acuerdo con los documentos (en la sección Index Lengths & MySQL / MariaDB ):

    Laravel usa el utf8mb4 caracteres utf8mb4 por defecto, que incluye soporte para almacenar “emojis” en la base de datos. Si está ejecutando una versión de MySQL anterior a la versión 5.7.7 o MariaDB anterior a la versión 10.2.2, puede que necesite configurar manualmente la longitud de cadena predeterminada generada por las migraciones para que MySQL cree índices para ellas. Puede configurar esto llamando al método Schema::defaultStringLength dentro de su AppServiceProvider .

    En otras palabras, en /app/Providers/AppServiceProvider.php :

     // Import Schema use Illuminate\Support\Facades\Schema; // ... class AppServiceProvider extends ServiceProvider { public function boot() { // Add the following line Schema::defaultStringLength(191); } // ... } 

    Pero como dice el comentario en la otra respuesta:

    Ten cuidado con esta solución. Si indexa campos de correo electrónico, por ejemplo, los correos electrónicos almacenados solo pueden tener una longitud máxima de 191 caracteres. Esto es menor que los estados oficiales de RFC.

    Entonces la documentación también propone otra solución:

    Alternativamente, puede habilitar la opción innodb_large_prefix para su base de datos. Consulte la documentación de su base de datos para obtener instrucciones sobre cómo habilitar correctamente esta opción.

    Para alguien que no quiere cambiar AppServiceProvider.php. (En mi opinión, es una mala idea cambiar AppServiceProvider.php solo para migrateion)

    Puede volver a agregar la longitud de los datos al archivo de migración en la base de datos / migraciones / de la siguiente manera:

    create_users_table.php

     $table->string('name',64); $table->string('email',128)->unique(); 

    create_password_resets_table.php

     $table->string('email',128)->index(); 

    Solo estoy agregando esta respuesta aquí, ya que es la solución más rápida para mí. Simplemente configure el motor de base de datos predeterminado en 'InnoDB' en

    /config/database.php

     'mysql' => [ ..., ..., 'engine' => 'InnoDB', ] 

    luego ejecute php artisan config:cache para borrar y actualizar el caché de configuración

    He resuelto este problema y he editado mi archivo config-> database.php para que me gusta mi base de datos (‘charset’ => ‘utf8’) y la (‘collation’ => ‘utf8_general_ci’) , por lo que mi problema está resuelto como código seguir:

     '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' => 'utf8', 'collation' => 'utf8_general_ci', 'prefix' => '', 'strict' => true, 'engine' => null, ], 

    En lugar de establecer un límite en la longitud, propondría lo siguiente, que me ha funcionado.

    Dentro

    config / database.php

    reemplace esta línea por mysql

     'engine' => 'InnoDB ROW_FORMAT=DYNAMIC', 

    sobre

     'engine' => null, 

    Como se describe en la guía de Migraciones para solucionar esto, todo lo que tiene que hacer es editar su app/Providers/AppServiceProvider.php y dentro del método de arranque establecer una longitud de cadena predeterminada:

     use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

    Nota: primero debe eliminar (si tiene) la tabla de usuarios , la tabla password_resets de la base de datos y eliminar las entradas de usuarios y password_resets de la tabla de migraciones .

    Para ejecutar todas sus migraciones pendientes, ejecute el comando migrate Artisan:

     php artisan migrate 

    Después de eso, todo debería funcionar de forma normal.

    Como ya se especificó, agregamos AppServiceProvider.php en la aplicación / proveedores

     use Illuminate\Support\Facades\Schema; // add this /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); // also this line } 

    Puede ver más detalles en el siguiente enlace (buscar “Longitudes de índice y MySQL / MariaDB”) https://laravel.com/docs/5.5/migrations

    ¡PERO BIEN, eso no es lo que publiqué! la cosa es que incluso cuando haces lo anterior es probable que obtengas otro error (es cuando ejecutas php artisan migrate comando php artisan migrate y debido al problema de la longitud, la operación probablemente se quede en el medio. La solución está debajo , y la tabla del usuario es probable que se cree sin el rest o no totalmente correctamente) tenemos que retroceder . la retrotracción predeterminada no funcionará. porque a la operación de migración no le gustó terminar. debe eliminar manualmente las nuevas tablas creadas en la base de datos.

    podemos hacerlo usando el tinker como se muestra a continuación:

     L:\todos> php artisan tinker Psy Shell v0.8.15 (PHP 7.1.10 — cli) by Justin Hileman >>> Schema::drop('users') => null 

    Yo mismo tuve un problema con la tabla de usuarios.

    después de eso estás listo para ir

    php artisan migrate:rollback

    php artisan migrate

    Si desea cambiar en AppServiceProvider, debe definir la longitud del campo de correo electrónico en la migración. simplemente reemplace la primera línea de código a la segunda línea.

    create_users_table

     $table->string('email')->unique(); $table->string('email', 50)->unique(); 

    create_password_resets_table

     $table->string('email')->index(); $table->string('email', 50)->index(); 

    Después de los cambios exitosos, puede ejecutar la migración.
    Nota: primero debe eliminar (si tiene) la tabla de usuarios , la tabla password_resets de la base de datos y eliminar las entradas de usuarios y password_resets de la tabla de migración.

    Esto es común ya que Laravel 5.4 cambió el juego de caracteres predeterminado de la base de datos a utf8mb4. Lo que tienes que hacer es: edita tu App \ Providers.php poniendo este código antes de la statement de la clase

     use Illuminate\Support\Facades\Schema; 

    Además, agréguelo a la función ‘boot’ Schema::defaultStringLength(191);

    Schema::defaultStringLength(191); definirá la longitud de todas las cadenas 191 de forma predeterminada, lo que puede arruinar su base de datos. No debes ir de esta manera.

    Simplemente defina la longitud de cualquier columna específica en la clase de migración de la base de datos. Por ejemplo, estoy definiendo el “nombre”, “nombre de usuario” y “correo electrónico” en la clase CreateUsersTable la siguiente manera:

     public function up() { Schema::create('users', function (Blueprint $table) { $table->increments('id'); $table->string('name', 191); $table->string('username', 30)->unique(); $table->string('email', 191)->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } 

    Para evitar cambiar cualquier cosa en su código , simplemente actualice su servidor MySQL al menos 5.7.7

    Consulte esto para obtener más información: https://laravel-news.com/laravel-5-4-key-too-long-error

    Tal como se describe en la guía Migrations para solucionar este problema, todo lo que tiene que hacer es editar su aplicación / Providers / AppServiceProvider.php y dentro del método de arranque establecer una longitud de cadena predeterminada:

     use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); } 

    primero debe eliminar (si tiene) tabla de usuarios , tabla password_resets de la base de datos y eliminar entradas de usuarios y password_resets de la tabla de migraciones .

    Para ejecutar todas sus migraciones pendientes, ejecute el comando migrar Artisan:

     php artisan migrate 

    Para cualquier otra persona que pudiera toparse con esto, mi problema era que estaba creando una columna de tipo string e intentando que sea ->unsigned() cuando quise que fuera un número entero.

    Creo que forzar StringLenght a 191 es una muy mala idea. Entonces investigo para entender lo que está pasando.

    Me di cuenta de que este mensaje de error:

    SQLSTATE [42000]: error de syntax o violación de acceso: 1071 La clave especificada era demasiado larga; la longitud máxima de la clave es 767 bytes

    Comencé a aparecer después de actualizar mi versión de MySQL. Así que he comprobado las tablas con PHPMyAdmin y he notado que todas las tablas nuevas creadas estaban con la intercalación utf8mb4_unicode_ci en lugar de utf8_unicode_ci para las anteriores.

    En mi archivo de configuración de doctrine, noté que el conjunto de caracteres se configuró en utf8mb4, pero todas mis tablas anteriores se crearon en utf8, así que supongo que esta es una actualización mágica que comienza a funcionar en utf8mb4.

    Ahora la solución más fácil es cambiar el juego de caracteres de línea en su archivo de configuración de ORM. Luego, suelte las tablas usando utf8mb4_unicode_ci si está en modo dev o arregle el juego de caracteres si no puede soltarlo.

    Para Symfony 4

    cambiar charset: utf8mb4 a charset: utf8 en config / packages / doctrine.yaml

    Ahora mis migraciones doctrineles están funcionando de nuevo bien.

    Estoy agregando dos soluciones que funcionan para mí.

    La primera solución es :

    1. Abra el archivo database.php insde config dir dir / folder.
    2. Edite 'engine' => null, a 'engine' => 'InnoDB',

      Esto funcionó para mí.

    La segunda solución es:

    1. Abra el archivo database.php insde config dir dir / folder.
      2. Editar
      'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci',
      a

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

    Buena suerte

    La aproximación a ese trabajo aquí fue pasar un segundo parámetro con el nombre clave (uno corto):

     $table->string('my_field_name')->unique(null,'key_name'); 

    Para mí, lo que funcionó fue actualizar las dependencias ejecutando.

     composer update