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
add uniqueusers_email_unique
([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
Respuestas:
De acuerdo con la documentación oficial , puede resolver esto con bastante facilidad.
Agregue las siguientes dos líneas de código a AppServiceProvider.php (/app/Providers/AppServiceProvider.php)
fuente
No sé por qué la solución anterior y la solución oficial que está agregando
en
AppServiceProvider
no funcionó para mí. Lo que funcionó fue editar eldatabase.php
archivo en laconfig
carpeta. Solo editaa
y debería funcionar, aunque no podrá almacenar caracteres multibyte extendidos como emoji .
Lo hice con Laravel 5.7. Espero eso ayude.
fuente
use Illuminate\Support\Facades\Schema;
en la parte superior.utf8mb4
recopilación está ahí por una razón, recomiendo usarla si puedes.Solo estoy agregando esta respuesta aquí, ya que es la
quickest
solución para mí. Simplemente configure el motor de base de datos predeterminado'InnoDB'
en/config/database.php
luego ejecute
php artisan config:cache
para borrar y actualizar la caché de configuraciónfuente
En el
AppServiceProvider.php
, incluye este código en la parte superior del archivo.fuente
Este problema está causado en Laravel 5.4 por la versión de la base de datos.
Según los documentos (en la
Index Lengths & MySQL / MariaDB
sección):En otras palabras, en
<ROOT>/app/Providers/AppServiceProvider.php
:Pero como dice el comentario sobre la otra respuesta:
Entonces la documentación también propone otra solución:
fuente
Para alguien que no quiere cambiar
AppServiceProvider.php
. (En mi opinión, es mala idea cambiarAppServiceProvider.php
solo por migración)Puede volver a agregar la longitud de datos al archivo de migración
database/migrations/
como se muestra a continuación:create_users_table.php
create_password_resets_table.php
fuente
Si enfrenta este error mientras trabaja en laravel mientras usa el comando:
php artisan migrate
simplemente agrega 2 líneas en el archivo: app-> Providers-> AppServiceProvider.phpuse Schema;
Schema::defaultStringLength(191);
Por favor revise esta imagen . luego ejecute el
php artisan migrate
comando nuevamente.fuente
\Schema::defaultStringLength(191);
Estoy agregando dos soluciones que funcionan para mí.
La primera solución es :
Editar
'engine' => null,
a'engine' => 'InnoDB',
Esto funcionó para mí.
La segunda solución es:
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
fuente
actualizar e insertar estas líneas en app / Providers / AppServiceProvider.php
fuente
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:
fuente
He encontrado dos soluciones para este error.
OPCIÓN 1:
Abra su usuario y password_reset tabla de base de datos / migraciones carpeta
Y simplemente cambie la longitud del correo electrónico:
OPCION 2:
Abra su
app/Providers/AppServiceProvider.php
archivo y dentro delboot()
método establezca una longitud de cadena predeterminada:fuente
1- Ve
/config/database.php
y encuentra estas líneasy cambiarlos a:
2- Ejecutar
php artisan config:cache
para reconfigurar laravel3- Elimine las tablas existentes en su base de datos y luego
php artisan migrate
vuelva a ejecutarfuente
En el archivo AppServiceProvider.php :
fuente
En lugar de establecer un límite de longitud, propondría lo siguiente, que me ha funcionado.
Dentro:
reemplace esta línea por mysql:
con:
fuente
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
archivo y, dentro del método de arranque, establecer una longitud de cadena predeterminada:Nota: primero tiene que 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ña_restablecimientos de las migraciones tabla de .
Para ejecutar todas sus migraciones pendientes, ejecute el
migrate
comando Artisan:Después de eso, todo debería funcionar normalmente.
fuente
Como ya se especificó, agregamos a AppServiceProvider.php en App / Providers
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é! El problema es que, incluso al hacer lo anterior, es probable que obtenga otro error (es decir, cuando ejecuta el
php artisan migrate
comando y, debido al problema de la longitud, la operación probablemente se atasque en el medio. La solución está debajo y es probable que se cree la tabla de usuario 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:
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
fuente
La solución que nadie dice es que en Mysql v5.5 y posteriores, InnoDB es el motor de almacenamiento predeterminado que no tiene este problema, pero en muchos casos como el mío hay algunos archivos de configuración mysql ini antiguos que usan el motor de almacenamiento MYISAM antiguo como se muestra a continuación.
que está creando todos estos problemas y la solución es cambiar el motor de almacenamiento predeterminado a InnoDB en el archivo de configuración ini de Mysql de una vez por todas en lugar de hacer hacks temporales.
Y si usted está en MySQL v5.5 o posterior entonces InnoDB es el motor predeterminado por lo que no es necesario establecer de manera explícita como la de arriba, basta con retirar el
default-storage-engine=MYISAM
caso de que exista de suini
archivo y que son buenos para ir.fuente
show global variables like 'innodb_large_prefix';
, debería estar ENCENDIDA . Si está APAGADO , puede verificar esta respuesta sobre cómo encenderlo. Y aquí hay más información sobre innodb_large_prefix en dev.mysql.com.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
create_password_resets_table
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_contraseña de la tabla de migración.
fuente
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
CreateUsersTable
clase de la siguiente manera:fuente
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
Además, agregue esto a la función 'boot'
Schema::defaultStringLength(191);
fuente
Si aún no tiene datos asignados a su base de datos, haga lo siguiente:
y dentro del método boot ();
Ahora elimine los registros en su base de datos, tabla de usuario para ej.
ejecuta lo siguiente
fuente
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
ya está allí. Espero que loComo 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:
Espero que esto te ayude ... amigos ...
fuente
Acabo de modificar la siguiente línea
users
ypassword_resets
archivo de migración.Antiguo :
$table->string('email')->unique();
Nuevo:
$table->string('email', 128)->unique();
fuente
Para evitar cambiar cualquier cosa en su código , simplemente actualice su servidor MySQL a al menos 5.7.7
Consulte esto para obtener más información: https://laravel-news.com/laravel-5-4-key-too-long-error
fuente
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:
Comencé a aparecer después de actualizar mi versión de MySQL. Así que revisé 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, por lo que supongo que esto 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
Ahora mis migraciones de doctrina están funcionando nuevamente bien.
fuente
La solución recomendada es habilitar
innodb_large_prefix
opción de MySQL para que no tenga problemas posteriores. Y aquí está cómo hacer eso:Abra el
my.ini
archivo de configuración de MySQL y agregue las siguientes líneas debajo de la[mysqld]
línea como esta.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,
a'engine' => 'innodb row_format=dynamic'
¡Espero eso ayude!
fuente
primero elimine todas las tablas de la base de datos en el host local
Cambie las propiedades de la base de datos predeterminada de Laravel (utf8mb4) en el archivo config / database.php a:
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
después de cambiar las propiedades de mi base de datos local utf8_unicode_ci. PHP artesanal migrar está bien.
fuente
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.fuente
La aproximación a ese trabajo aquí fue pasar un segundo parámetro con el nombre clave (uno corto):
fuente
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:
Eliminar el 1000 o configurarlo en 191 resolvió mi problema.
fuente