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 (
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.