una tabla solo refrescar nombre modificar migrar migraciones migracion especifica ejecutar cambiar php mysql laravel

php - tabla - Migración de Laravel: clave única es demasiado larga, incluso si se especifica



modificar migraciones laravel (23)

Acaba de instalar MariaDB 10.2.4 RC, activó el nuevo proyecto Laravel 5.4 en blanco y la migración predeterminada (varchar (255) columnas) funciona.

No es necesario cambiar DB conf y Laravael config/database.php . Por lo tanto, al igual que @scorer señaló sobre el comportamiento predeterminado para 10.2.2+.

Estoy intentando migrar una tabla de usuarios en Laravel. Cuando ejecuto mi migración obtengo este error:

[Illuminate / Database / QueryException] SQLSTATE [42000]: error de sintaxis 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 tabla alter agregan user_email_uniq únicos ( email ))

mi migración es la siguiente:

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

Después de buscar en Google me encontré con este informe de error donde Taylor dice que puede especificar la clave de índice como el segundo parámetro de unique() , que he hecho. Todavía da el error. ¿Que esta pasando aqui?


Agregué a la migración misma

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

sí, sé que debo considerarlo en cada migración, pero preferiría hacerlo en lugar de tenerlo guardado en un proveedor de servicios completamente independiente.


Cambiar el juego de caracteres de ''utf8mb4'' a ''utf8'' y

colación a ''utf8mb4_unicode_ci'' a ''utf8_unicode_ci''

en el archivo config / database.php

Funcionó para mí


Elimina mb4 del conjunto de caracteres y la intercalación de config / database.php, luego se ejecutará correctamente.
''charset'' => ''utf8'',
''colación'' => ''utf8_unicode_ci'',


En archivo config / database.php donde:

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

Cambia esta línea a esto:

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


Es porque Laravel 5.4 usa utf8mb4 que admite el almacenamiento de emojis.

Agregue esto en su aplicación / Providers / AppServiceProvider.php

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

y deberías ser bueno para ir.


Especifique una longitud más pequeña para su correo electrónico:

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

¿Cuál es el valor predeterminado, en realidad?

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

Y deberías ser bueno.

Para Laravel 5.4, puede encontrar una solución en este laravel-news.com/laravel-5-4-key-too-long-error publicación de laravel-news.com/laravel-5-4-key-too-long-error :

Tal como se describe en la guía de Migraciones para solucionar este problema, 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:

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


Establecer el motor de base de datos InnoDB:

Schema::create(''users'', function (Blueprint $table) { $table->engine = ''InnoDB''; $table->increments(''id''); $table->string(''name''); $table->string(''email'')->unique(); $table->string(''password''); $table->rememberToken(); $table->timestamps(); });


Esto funcionó para mí:

$table->charset = ''utf8''; $table->collation = ''utf8_unicode_ci'';


He enfrentado el mismo problema y lo solucioné agregando las dos líneas siguientes en mi aplicación / database.php

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

Mi archivo se ve a continuación:

<?php return [ /* |-------------------------------------------------------------------------- | Default Database Connection Name |-------------------------------------------------------------------------- | | Here you may specify which of the database connections below you wish | to use as your default connection for all database work. Of course | you may use many connections at once using the Database library. | */ ''default'' => env(''DB_CONNECTION'', ''mysql''), ''charset'' => ''utf8'', ''collation'' => ''utf8_unicode_ci'', ......


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 AppServiceProvider :

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

Puedes verificar en

laravel-news.com/laravel-5-4-key-too-long-error https://laravel.com/docs/5.5/migrations#indexes


Me gustaría señalar algo que me perdí ...

Soy nuevo en Laravel, y no copié el "uso Iluminar ....." porque realmente no presté atención, porque justo encima del inicio de la función ya tienes una declaración de uso .

Espero que ayude a cualquiera

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


No tendrá este problema si está utilizando MySQL 5.7.7+ o MariaDB 10.2.2+.

Para actualizar MariaDB en tu Mac usando Brew, primero desvincula el actual: brew unlink mariadb y luego instala un dev one usando brew install mariadb --devel

Después de realizar la instalación, detenga / inicie el servicio en ejecución: los brew services stop mariadb brew services start mariadb

La versión de desarrollo actual es 10.2.3. Una vez finalizada la instalación, ya no tendrá que preocuparse por esto y podrá usar utf8mb4 (que ahora es un valor predeterminado en Laravel 5.4) sin cambiar a utf8 ni editar AppServiceProvider como se propone en la documentación de Laravel: https: // laravel .com / docs / master / releases # laravel-5.4 (desplácese hacia abajo a: Longitud de cadena predeterminada de migración )


Para Laravel> = 5.6 usuarios

Abra el archivo AppServiceProvider.php

Use la siguiente clase

use Illuminate/Support/Facades/Schema;

Luego, dentro boot método de boot , agregue la siguiente línea

public function boot() { Schema::defaultStringLength(191); }


Para laravel 5.4, simplemente edita el archivo

App / Providers / AppServiceProvider.php

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


Para laravel 5.6
Esta solución soluciona mi problema
ve a config/database.php
Encuentra el código a continuación

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

Cambia este dos campo

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

Con este

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


Si alguien más tropieza con esta respuesta como yo lo hice, pero por una razón diferente, puede verificar su Laravel DB conjunto de caracteres / colación.

Estaba instalando una aplicación (Snipe-IT) y había configurado la configuración de la base de datos de Laravel para usar lo siguiente:

''charset'' => ''utf8mb4'', ''collation'' => ''utf8mb4_general_ci'',

La eliminación de mb4 de ambas cadenas resolvió el problema, aunque creo que la respuesta de Antonio es la solución real al problema.


Si está conectado o actualizado a Laravel 5.4 Esto funcionó para mí;

Solo 1 cambio. en AppServiceProvider.php

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

Como se menciona en la guía de migración https://laravel.com/docs/master/migrations#creating-indexes


Si está conectado o actualizado a Laravel 5.4 y la última versión, funciona;
Solo 1 cambio en AppServiceProvider.php

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


Todo estaba bien descrito en los otros Anwser, puede ver más detalles en el siguiente enlace (buscar con la clave ''Longitudes de índice y MySQL / MariaDB'') https://laravel.com/docs/5.5/migrations

PERO BIEN ¡De eso no se trata esta respuesta! el problema es que al hacer lo anterior , te gustará obtener otro error (es cuando te gusta php artisan migrate comando de php artisan migrate y debido al problema de la longitud, la operación como "pegado en el medio" es la solución más abajo , y la tabla de usuario es como creado sin el resto o no totalmente correctamente) tenemos que rodar bac k. 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 Tinker como en fuelle:

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, es bueno ir

php artisan migrate:rollback php artisan migrate


incluir esta línea en la parte superior

use Illuminate / Support / Facades / Schema;

luego dentro de la función de arranque agrega esto

Schema :: defaultStringLength (191);


tuve el mismo problema y estoy usando un wamp

Solución: Abrir archivo: config / database.php

''engine'' => null, => ''engine'' => ''InnoDB'',

Gracias


Actualización 1

A partir de Laravel 5.4 esos cambios ya no son necesarios.

Laravel 5.4 usa el juego de caracteres utf8mb4 por defecto, que incluye soporte para almacenar "emojis" en la base de datos. Si está actualizando su aplicación desde Laravel 5.3, no es necesario que cambie a este juego de caracteres.

Actualización 2

La producción actual de las versiones de MariaDB NO admite esta configuración de manera predeterminada a nivel mundial. Se implementa en MariaDB 10.2.2+ de manera predeterminada .

Solución

Y si intencionalmente quiere usar la compatibilidad utf8mb4 -UTF8 multi-byte utf8mb4 correcta para el futuro (a partir de Laravel 5.4) para 😀, entonces comience a corregir 😂 la configuración de su base de datos.

En Laravel config/database.php define:

''charset'' => ''utf8mb4'', ''collation'' => ''utf8mb4_unicode_ci'', ''engine'' => ''InnoDB ROW_FORMAT=DYNAMIC'',

DYNAMIC permite almacenar índices clave largos .

Configuración del servidor (por defecto incluida en MySQL 5.7.7+ / MariaDB 10.2.2+):

[mysqld] # default character set and collation collation-server = utf8mb4_unicode_ci character-set-server = utf8mb4 # utf8mb4 long key index innodb_large_prefix = 1 innodb_file_format = barracuda innodb_file_format_max = barracuda innodb_file_per_table = 1

Para clientes:

[mysql] default-character-set=utf8mb4

Y luego PARE su servidor MySQL / MariaDB. Después de eso START. El reinicio en caliente puede no funcionar.

sudo systemctl stop mysqld sudo systemctl start mysqld

Ahora tiene Laravel 5.x con soporte UTF8.