Estoy tratando de migrar una tabla de usuarios en Laravel. Cuando ejecuto mi migración me sale este error:
[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: alterar tabla
users
agregar usuarios únicos_email_uniq (
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()
, lo que he hecho. Todavía da el error. ¿Que esta pasando aqui?
Respuestas:
Especifique una longitud menor para su correo electrónico:
Cuál es el valor predeterminado, en realidad:
Y deberías ser bueno.
Para Laravel 5.4 puede encontrar una solución en este Laravel 5.4: La clave especificada fue un error demasiado largo, publicación de Laravel News :
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:
fuente
254
Probablemente valga la pena tener en cuenta la longitud máxima posible del correo electrónico , por lo que probablemente validaría la unicidad utilizando el validador en ese caso.\Illuminate\Database\Schema\Builder::defaultStringLength(191);
para la ruta de referencia de función correctaActualización 1
A partir de Laravel 5.4, esos cambios ya no son necesarios.
Actualización 2
Producción actual MariaDB versiones NO admiten esta configuración de forma predeterminada a nivel mundial. Se implementa en MariaDB 10.2.2+ por defecto .
Solución
Y si intencionalmente desea utilizar el
utf8mb4
soporte correcto de múltiples bytes UTF8 futuro predeterminado (a partir de Laravel 5.4) para 😀, entonces comience a arreglar 😂 la configuración de su base de datos.En Laravel
config/database.php
define:DYNAMIC
permite almacenar índices de clave largos .Configuración del servidor (por defecto incluido en MySQL 5.7.7+ / MariaDB 10.2.2+):
Para clientes:
Y luego PARAR su servidor MySQL / MariaDB. Después de eso COMIENCE. El reinicio en caliente puede no funcionar.
Ahora tiene Laravel 5.x con soporte UTF8.
fuente
database.php
archivo de configuración e impactará en el proyecto local de Laravel. Asegúrese dedelete
crear una base de datos antes de realizar cambios y crearla con una nueva configuración.my.cnf
Debe cambiar el archivo de configuración solo para los cambios globales del lado del servidor (actualmente se usan todas las instalaciones nuevasutf8mb4
).options={"row_format"="DYNAMIC"}
a su@Table
anotación.Si está conectado o actualizado a Laravel 5.4, esto funcionó para mí;
Solo 1 cambio. en AppServiceProvider.php
Como se menciona en la guía de migración https://laravel.com/docs/master/migrations#creating-indexes
fuente
Si alguien más se topa con esta respuesta como lo hice yo, pero por una razón diferente, puede verificar su conjunto de caracteres / cotejo Laravel DB.
Estaba instalando una aplicación (Snipe-IT) y había configurado la configuración de la base de datos Laravel para usar lo siguiente:
La eliminación
mb4
de ambas cadenas solucionó el problema, aunque creo que la respuesta de Antonio es la solución real al problema.fuente
Esto funcionó para mí:
fuente
Elimine mb4 de charset y collation de config / database.php, luego se ejecutará con éxito.
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
fuente
Para laravel 5.6
Esta solución resuelve mi problema,
vaya a
config/database.php
Buscar el código a continuación
Cambia estos dos campos
Con este
fuente
Me he enfrentado al mismo problema y lo solucioné agregando las dos líneas a continuación en mi aplicación / base de datos.php
Mi archivo se ve a continuación:
fuente
Para laravel 5.4, simplemente edite el archivo
fuente
fuente
tuve el mismo problema y estoy usando un wamp
Solución: Abra el archivo: config / database.php
Gracias
fuente
En el archivo config / database.php donde:
Cambie esta línea a esto:
fuente
Para Laravel> = 5.6 usuarios
Abrir
AppServiceProvider.php
archivoUsa la siguiente clase
Luego, dentro del
boot
método, agregue la siguiente líneafuente
Agregué a la migración en sí
Sí, sé que necesito tenerlo en cuenta en cada migración, pero preferiría eso en vez de guardarlo en algún proveedor de servicios completamente ajeno.
fuente
Si alguien tiene este problema incluso después de hacerlo, los cambios mencionados anteriormente. Por ejemplo, en mi caso hice los siguientes cambios,
Pero no funcionaría de inmediato por dos razones. Una es que si está utilizando lumen en lugar de laravel, es posible que primero deba descomentar esta línea en su archivo app.php.
Y luego tienes que crear el script de migración nuevamente con el comando artesanal,
Como ahora solo funcionarán los cambios que haya realizado en ServiceProvider.
fuente
para laravel 5.7, escriba este código en appserviceprovider.php
fuente
Cambie charset de 'utf8mb4' a 'utf8' y
colación a 'utf8mb4_unicode_ci' a 'utf8_unicode_ci'
en el archivo config / database.php
Funcionó para mi.
fuente
Laravel utiliza el
utf8mb4
conjunto de caracteres 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, 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 alSchema::defaultStringLength
método dentro de suAppServiceProvider
:Puedes retirar de
https://laravel-news.com/laravel-5-4-key-too-long-error https://laravel.com/docs/5.5/migrations#indexes
fuente
Es porque Laravel 5.4 usa utf8mb4 que admite el almacenamiento de emojis.
Agregue esto en su aplicación \ Proveedores \ AppServiceProvider.php
y deberías estar listo para ir.
fuente
Si está conectado o actualizado a Laravel 5.4 y la última versión, funciona;
Solo 1 cambio en AppServiceProvider.php
fuente
Me gustaría señalar que algo que me perdí ...
Soy nuevo en Laravel, y no copié "use Illuminate ....." porque realmente no presté atención, porque justo encima del arranque de la función ya tienes un uso Declaración de .
Espero que ayude a cualquiera
fuente
\
Tuve un problema, cambie la configuración de 'config / database'
manteniendo el mismo patrón en la base de datos.
Entonces di la orden
fuente
En 24 de octubre de 2016, Taylor Otwell, el autor de Laravel, anunció en Twitter
que antes de la versión 5.4 el juego de caracteres era
utf8
Durante este siglo, muchas aplicaciones web incluyen chat o alguna clase de plataforma para permitir que sus usuarios conversen, y a muchas personas les gusta usar emoji o smiley. y este es algún tipo de súper personajes que requieren más espacios para ser almacenados y que solo es posible usar
utf8mb4
como juego de caracteres . Esa es la razón por la que migranutf8mb4
solo por motivos de espacio.si mira hacia arriba en la
Illuminate\Database\Schema\Builder
clase, verá que$defaultStringLength
está configurado en 255 , y para modificarlo, puede continuar a través de laSchema
Fachada y llamar aldefaultStringLength
método y pasar la nueva longitud.para realizar ese cambio, llame a ese método dentro de su
AppServiceProvider
clase que se encuentra en el subdirectorio app \ proveedores como esteSugeriré usar 191 como valor solo porque MySQL admite 767 bytes, y porque
767 / 4
cuál es el número de bytes tomados por cada carácter multibyte que obtendrá191
.Puede obtener más información aquí Los límites del conjunto de caracteres utf8mb4 (codificación Unicode UTF-8 de 4 bytes) en el recuento de columnas de tabla y el tamaño de fila
fuente
191
número mágico.SOLUCIÓN:
Primero cambie defaultStringLength a 191, en la aplicación \ Proveedores \ AppServiceProvider.php :
Luego, cambie los valores de conjunto de caracteres y colación de la siguiente manera, en config \ database.php :
( enlace para saber sobre el juego de caracteres MariaDB )
fuente
Ir a tu
config/database.php
y cambiar el juego de caracteres y la clasificación de utf8mb4 a utf8Mi problema se resolvió usando este método, ¡buena suerte amigo!
fuente
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 desarrollador usandobrew install mariadb --devel
Una vez realizada la instalación, detenga / inicie la ejecución del servicio:
brew services stop mariadb brew services start mariadb
La versión actual del desarrollador es 10.2.3. Una vez finalizada la instalación, ya no tendrá que preocuparse por esto y puede usar utf8mb4 (que ahora es un valor predeterminado en Laravel 5.4) sin volver 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 hasta: Longitud de cadena predeterminada de migración )
fuente
Acabo de instalar MariaDB 10.2.4 RC, activé un nuevo proyecto en blanco de Laravel 5.4 y funciona la migración predeterminada (columnas varchar (255)).
No es necesario cambiar DB conf y Laravael
config/database.php
. Así, tal como @scorer señaló sobre el comportamiento predeterminado para 10.2.2+.fuente
Todo estaba bien descrito en los otros Anwser. Puede ver más detalles en el siguiente enlace (busque con la clave 'Index Lengths & MySQL / MariaDB ") https://laravel.com/docs/5.5/migrations
¡PERO BIEN, de eso no se trata esta respuesta! la cosa es que, incluso al hacer lo anterior , le gustaría obtener otro error (es decir, cuando le gusta el
php artisan migrate
comando de lanzamiento y debido al problema de la longitud, la operación está atascada en el medio. La solución es inferior y la tabla de usuario es como creada sin el resto o no del todo correctamente) necesitamos rodar bac . 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:
Yo mismo tuve un problema con la tabla de usuarios.
después de eso estás bien para ir
fuente
Establecer el motor de base de datos InnoDB:
fuente
Si ha intentado cualquier otra respuesta y no han funcionado, puede eliminar todas las tablas de la base de datos y luego ejecutar el comando migrar de una vez usando este comando:
fuente