longitud larga demasiado declaracion clave mysql laravel pdo laravel-5 laravel-5.4

mysql - declaracion - Error de migración de Laravel: Error de sintaxis o infracción de acceso: 1071 La clave especificada era demasiado larga; la longitud máxima de la clave es de 767 bytes



mysql declaracion de clave demasiado larga (30)

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

[Illuminate / Database / QueryException] SQLSTATE [42000]: Error de sintaxis o infracción de acceso: 1071 La clave especificada era demasiado larga; la longitud máxima de la clave es de 767 bytes (SQL: alter tabl e users agregar users users_email_unique ( email ))

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


Acabo de modificar la siguiente línea en los users y el archivo de migración de password_resets .

Antiguo: $table->string(''email'')->unique();

Nuevo: $table->string(''email'', 128)->unique();

Voila !!


Agregue el siguiente código en el método app/Providers/AppServiceProvider.php :

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

primero tiene que eliminar (si tiene) la tabla de usuarios , la tabla de restablecimientos de contraseña de la base de datos y eliminar las entradas de usuarios y restablecimientos de contraseña de la tabla de migraciones y luego, después de eliminar las tablas antiguas, ejecute php artisan migrate comando php artisan migrate



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 establezca 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 de contraseña_restablecimientos de la base de datos y eliminar las entradas de usuarios y contraseñas 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 normalmente.


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

[mysqld] innodb_file_format = Barracuda innodb_large_prefix = 1 innodb_file_per_table = ON

Espero que esto te ayude ... amigos ...


Como ya se especificó, agregamos a AppServiceProvider.php en App / Providers

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 (busque "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 haga lo anterior, es probable que obtenga otro error (es cuando ejecuta php artisan migrate comando php artisan migrate y, debido al problema de la longitud, la operación probablemente se atascará en el medio. La solución está debajo y la tabla de usuario es probable que se cree sin el resto o no del todo correctamente) necesitamos retroceder . la reversión predeterminada no funcionará. porque a la operación de migración no le gustaba terminar. necesita eliminar las nuevas tablas creadas en la base de datos manualmente.

podemos hacerlo usando 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 eres bueno para ir

php artisan migrate:rollback

php artisan migrate


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

Noté que este mensaje de error:

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

Comencé a aparecer después de actualizar mi versión de MySQL. Así que verifiqué las tablas con PHPMyAdmin y noté que todas las tablas nuevas creadas tenían la clasificación utf8mb4_unicode_ci en lugar de utf8_unicode_ci para las antiguas.

En mi archivo de configuración de doctrina, noté que charset estaba configurado en utf8mb4, pero todas mis tablas anteriores fueron creadas en utf8, así que supongo que esta es una actualización de magia que comienza a funcionar en utf8mb4.

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

Para Symfony 4

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

Ahora mis migraciones de doctrina están funcionando nuevamente bien.


De acuerdo con la documentación oficial , puede resolver esto con bastante facilidad.

Agregue el siguiente código a AppServiceProvider.php (/app/Providers/AppServiceProvider.php)

use Illuminate/Support/Facades/Schema; //NEW: Import Schema function boot() { Schema::defaultStringLength(191); //NEW: Increase StringLength }

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


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

use Illuminate/Support/Facades/Schema;

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

Schema::defaultStringLength(191);


En el archivo AppServiceProvider.php :

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


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

Dentro

config / database.php

reemplace esta línea por mysql

''mysql'' => [ ..., ''charset'' => ''utf8mb4'', ''collation'' => ''utf8mb4_unicode_ci'', ..., ''engine'' => null, ]

sobre

''mysql'' => [ ..., ''charset'' => ''utf8'', ''collation'' => ''utf8_unicode_ci'', ..., ''engine'' => ''InnoDB'', ]


Estaba recibiendo este error a pesar de que ya tenía (en realidad porque ya tenía) Schema :: defaultStringLength (191); en mi archivo AppServiceProvider.php.

La razón es porque estaba tratando de establecer un valor de cadena en una de mis migraciones a un valor superior a 191:

Schema::create(''order_items'', function (Blueprint $table) { $table->primary([''order_id'', ''product_id'', ''attributes'']); $table->unsignedBigInteger(''order_id''); $table->unsignedBigInteger(''product_id''); $table->string(''attributes'', 1000); // This line right here $table->timestamps(); });

Eliminar el 1000 o configurarlo en 191 resolvió mi problema.


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

Según los docs (en la sección Index Lengths & MySQL / MariaDB ):

Laravel utiliza el utf8mb4 caracteres utf8mb4 de forma predeterminada, 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, es posible que deba configurar manualmente la longitud de cadena predeterminada generada por las migraciones para que MySQL cree índices para ellos. Puede configurar esto llamando al método Schema::defaultStringLength dentro de su AppServiceProvider .

En otras palabras, en <ROOT>/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 sobre 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 menos 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 esta opción correctamente.


Esto es común ya que Laravel 5.4 cambió el conjunto de caracteres predeterminado de la base de datos a utf8mb4. Lo que debe hacer es: editar su App / Providers.php poniendo este código antes de la declaración de clase

use Illuminate/Support/Facades/Schema;

Además, agregue esto a la función ''boot'' Schema::defaultStringLength(191);


Estoy agregando dos sollution que funcionan para mí.

sollution :

  1. Abra el archivo database.php insde config 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 / folder.
    2. Editar
    ''charset'' => ''utf8mb4'', ''collation'' => ''utf8mb4_unicode_ci'',
    a

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


Buena suerte


He resuelto este problema y edité mi archivo config-> database.php para que me guste mi base de datos (''charset'' => ''utf8'') y el (''collation'' => ''utf8_general_ci'') , por lo que mi problema está resuelto el código como 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, ],


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'');


La solución recomendada es habilitar la opción innodb_large_prefix de MySQL para que no tenga problemas posteriores. Y aquí está cómo hacer eso:

Abra el archivo de configuración my.ini MySQL y agregue las siguientes líneas debajo de la línea [mysqld] de esta manera.

//edit your AppServiceProvider.php file contains in providers folder use Illuminate/Support/Facades/Schema; public function boot() { Schema::defaultStringLength(191); }

Después de eso, guarde sus cambios y reinicie su servicio MySQL.

Retroceda si lo necesita y luego vuelva a ejecutar su migración.

En caso de que su problema persista, vaya al archivo de configuración de su base de datos y configure

''engine'' => null, to ''engine'' => ''innodb row_format=dynamic''

¡Espero eso ayude!


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 de config . Solo edita

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

a

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

y debería funcionar Espero eso ayude.



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

Puede volver a agregar la longitud de datos al archivo de migración en la database/migrations/ como se muestra a continuación:

create_users_table.php

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

create_password_resets_table.php

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


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


Puede establecer una longitud de cadena del campo indexado de la siguiente manera:

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


Si aún no tiene datos asignados a su base de datos, haga lo siguiente:

  1. Vaya a app / Providers / AppServiceProvide.php y agregue

use Illuminate / Support / ServiceProvider;

y dentro del método boot ();

Esquema :: defaultStringLength (191);

  1. Ahora elimine los registros en su base de datos, tabla de usuario para ej.

  2. ejecuta lo siguiente

php artisan config: caché

php artesanal migrar


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 por 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 de contraseña_restablecimientos de la base de datos y eliminar las entradas de usuarios y contraseñas de la tabla de migración.


Si enfrenta este error mientras trabaja en laravel mientras usa el comando: php artisan migrate migrate, simplemente agregue 2 líneas en el archivo: app-> Providers-> AppServiceProvider.php

  1. use Schema;
  2. Schema::defaultStringLength(191);

Por favor revise esta imagen . luego ejecute php artisan migrate comando php artisan migrate nuevamente.


Solo agrego esta respuesta aquí, ya que es la solución quickest 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 la caché de configuración


actualizar e insertar estas líneas en app / Providers / AppServiceProvider.php

use Illuminate/Support/Facades/Schema; // add this line at top of file public function boot() { Schema::defaultStringLength(191); // add this line in boot method }


Schema::defaultStringLength(191); definirá la longitud de todas las cadenas 191 por defecto, lo que puede arruinar su base de datos. No debes ir por este camino.

Simplemente defina la longitud de cualquier columna específica en la clase de migración de 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(); }); }


1- Ve a /config/database.php y busca estas líneas

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

y cambiarlos a:

''engine'' => null,

2- Ejecute php artisan config:cache para reconfigurar laravel

3- Elimine las tablas existentes en su base de datos y luego ejecute php artisan migrate nuevamente