Erreur de migration sur Laravel 5.4 avec php artisan make:auth
[Illuminate\Database\QueryException] SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1071 La clé spécifiée était trop longue; La longueur maximale de la clé est de 767 octets (SQL: modification du tableau
users
ajouter uniqueusers_email_unique
([PDOException] SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1071 La clé spécifiée était trop longue; La longueur maximale de la clé est de 767 octets.
Selon la documentation officielle , vous pouvez résoudre ce problème assez facilement.
Ajoutez le code suivant à AppServiceProvider.php (/app/Providers/AppServiceProvider.php)
use Illuminate\Support\Facades\Schema; //NEW: Import Schema
function boot()
{
Schema::defaultStringLength(191); //NEW: Increase StringLength
}
MySQL réserve toujours le montant maximal pour un champ UTF8 de 4 octets, donc avec 255 + 255 avec votre DEFAULT CHARACTER SET. vous avez dépassé la limite de 767 longueur maximale de clé. Par @scaisedge
Je ne sais pas pourquoi la solution ci-dessus et la solution officielle qui ajoute
Schema::defaultStringLength(191);
dans AppServiceProvider
n'a pas fonctionné pour moi . Ce qui a bien fonctionné a été la modification du fichier database.php
dans le dossier config
. Il suffit de modifier
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
à
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
et ça devrait marcher ... Espérons que ça aide.
J'ajoute simplement cette réponse ici car c'est la solutionquickest
pour moi. Il suffit de définir le moteur de base de données par défaut sur'InnoDB'
on
/config/database.php
'mysql' => [
...,
...,
'engine' => 'InnoDB',
]
puis exécutezphp artisan config:cache
pour effacer et actualiser le cache de configuration
Dans le AppServiceProvider.php
, vous incluez ce code en haut du fichier.
use Illuminate\Support\Facades\Schema;
Et vous ajoutez ce code dans la méthode de démarrage.
Schema::defaultStringLength(191);
Ce problème est provoqué dans Laravel 5.4 par la version de la base de données.
Selon le docs (dans la section Index Lengths & MySQL / MariaDB
):
Laravel utilise le jeu de caractères
utf8mb4
par défaut, qui inclut support pour stocker "emojis" dans la base de données. Si vous utilisez un version de MySQL antérieure à la version 5.7.7 ou MariaDB antérieure à Dans la version 10.2.2, vous devrez peut-être configurer manuellement le fichier par défaut longueur de chaîne générée par les migrations pour permettre à MySQL de créer index pour eux. Vous pouvez le configurer en appelant leSchema::defaultStringLength
méthode dans votreAppServiceProvider
.
En d'autres termes, dans <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);
}
// ...
}
Mais comme le commentaire sur l'autre réponse dit:
Attention à cette solution. Si vous indexez les champs de courrier électronique, par exemple, Les e-mails stockés ne peuvent avoir qu'une longueur maximale de 191 caractères. C'est moins que le RFC officiel déclare.
La documentation propose donc également une autre solution:
Vous pouvez également activer l'option
innodb_large_prefix
pour votre fichier base de données. Reportez-vous à la documentation de votre base de données pour obtenir des instructions sur comment activer correctement cette option.
Pour quelqu'un qui ne veut pas changer AppServiceProvider.php
. (À mon avis, c'est une mauvaise idée de changer AppServiceProvider.php
juste pour la migration)
Vous pouvez rajouter la longueur des données dans le fichier de migration sous database/migrations/
comme ci-dessous:
create_users_table.php
$table->string('name',64);
$table->string('email',128)->unique();
create_password_resets_table.php
$table->string('email',128)->index();
Ajoutez le code ci-dessous dans la méthode app/Providers/AppServiceProvider.php
:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
vous devez d'abord supprimer (si vous avez) la table users, la table password_resets de la base de données et supprimer les entrées d'utilisateurs et de mot de passe du tableau migrations, puis, après la suppression des anciennes tables, exécuter php artisan migrate
commander
Au lieu de fixer une limite de longueur, je propose ce qui suit, qui a fonctionné pour moi.
À l'intérieur
config/database.php
remplace cette ligne pour mysql
'engine' => 'InnoDB ROW_FORMAT=DYNAMIC',
upon
'engine' => null,
J'ai résolu ce problème et modifié mon fichier config-> database.php pour qu'il ressemble à ma base de données ('charset' => 'utf8') et le ('collation' => 'utf8_general_ci') , donc mon problème est résolu le code comme suit:
'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,
],
Comme déjà spécifié, nous ajoutons au fichier AppServiceProvider.php dans App/Providers
use Illuminate\Support\Facades\Schema; // add this
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191); // also this line
}
vous pouvez voir plus de détails dans le lien ci-dessous (recherche "Index Lengths & MySQL/MariaDB") https://laravel.com/docs/5.5/migrations
MAIS BIEN, ce n’est pas ce que j’ai publié! la chose est même en faisant ce qui précède vous risquez probablement d'obtenir une autre erreur (c'est à ce moment-là que vous exécuterez la commande php artisan migrate
et en raison du problème de longueur, l'opération sera probablement bloquée au milieu. la solution est inférieure à, et la table utilisateur est probablement créée sans le reste ou pas totalement correctement) nous devons annuler. la restauration par défaut ne fonctionnera pas. parce que l'opération de migration n'a pas aimé finir. vous devez supprimer manuellement les nouvelles tables créées dans la base de données.
on peut le faire en utilisant bricoler comme ci-dessous:
L:\todos> php artisan tinker
Psy Shell v0.8.15 (PHP 7.1.10 — cli) by Justin Hileman
>>> Schema::drop('users')
=> null
J'ai moi-même eu un problème avec la table des utilisateurs.
après que vous êtes prêt à partir
php artisan migrate:rollback
php artisan migrate
Dans AppServiceProvider.php fichier:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
Schema::defaultStringLength(191);
définira la longueur de toutes les chaînes 191 par défaut, ce qui peut ruiner votre base de données. Vous ne devez pas aller de cette façon.
Définissez simplement la longueur d'une colonne spécifique dans la classe de migration de la base de données. Par exemple, je définis le "nom", le "nom d'utilisateur" et le "email" dans la classe CreateUsersTable
comme ci-dessous:
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();
});
}
Comme indiqué dans le document Migrations guide pour résoudre ce problème, tout ce que vous avez à faire est de modifier votre fichier app/Providers/AppServiceProvider.php
et, dans la méthode de démarrage, définissez une longueur de chaîne par défaut:
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
Remarque: vous devez d'abord supprimer (si vous avez) la table users, la table password_resets de la base de données et supprimer les utilisateurs et les entrées de mot_passe de migrations.
Pour exécuter toutes vos migrations en attente, exécutez la commande migrate
Artisan:
php artisan migrate
Après cela, tout devrait fonctionner normalement.
J'ajoute deux sollution qui fonctionnent pour moi.
_ {1st sollution is :
Éditer 'engine' => null,
en 'engine' => 'InnoDB',
Cela a fonctionné pour moi.
_ {La seconde demande est:} _
Ouvrez le dossier database.php _ file insde config dir /.
2 .Éditer
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
à
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
Bonne chance
Ceci est courant depuis que Laravel 5.4 a modifié le jeu de caractères de base de données par défaut en utf8mb4. Ce que vous devez faire, c'est: éditez votre App\Providers.php en mettant ce code avant la déclaration de classe
use Illuminate\Support\Facades\Schema;
Ajoutez également ceci à la fonction 'boot' Schema::defaultStringLength(191);
Je viens de modifier la ligne suivante dansusers
etpassword_resets
fichier de migration.
Ancien: $table->string('email')->unique();
Nouveau: $table->string('email', 128)->unique();
Voila !!
Comme indiqué dans le guide Migrations pour résoudre ce problème, il vous suffit de modifier votre fichier AppServiceProvider.php et, dans la méthode de démarrage, définissez une longueur de chaîne par défaut:
//edit your AppServiceProvider.php file contains in providers folder
use Illuminate\Support\Facades\Schema;
public function boot()
{
Schema::defaultStringLength(191);
}
J'espère que cela vous aidera. Cheers ..
mettre à jour et insérer ces lignes dans app/Providers/AppServiceProvider.php
use Illuminate\Support\Facades\Schema; //insert this line
public function boot()
{
Schema::defaultStringLength(191); //insert this line also
}
configurez votre moteur de base de données dans config/database.php dans le tableau 'mysql'
'engine' => 'InnoDB',
Si aucune base de données ne vous a déjà été attribuée, procédez comme suit:
utilisez Illuminate\Support\ServiceProvider;
et à l'intérieur de la méthode boot ();
Schema :: defaultStringLength (191);
Supprimez maintenant les enregistrements de votre base de données, la table utilisateur par ex.
lancer le suivant
php artisan config: cache
php artisan migrer
Si vous souhaitez modifier AppServiceProvider, vous devez définir la longueur du champ de courrier électronique dans la migration. remplacez simplement la première ligne de code par la deuxième ligne.
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();
Une fois les modifications apportées, vous pouvez exécuter la migration.
Remarque: vous devez d’abord supprimer (si vous avez) la table users, la table password_resets de la base de données et supprimer les entrées user et password_resets du tableau de migration.
1- Aller à/config/database.php
et trouver ces lignes
'mysql' => [
...,
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
...,
'engine' => null,
]
et les changer pour:
'mysql' => [
...,
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
...,
'engine' => 'InnoDB',
]
2- Runphp artisan config:cache
pour reconfigurer laravel
3- Supprimez les tables existantes de votre base de données, puis exécutezphp artisan migrate
à nouveau.
La solution recommandée consiste à activer l'option innodb_large_prefix
de MySQL afin d'éviter les problèmes ultérieurs. Et voici comment faire cela:
Ouvrez le fichier de configuration MySQL my.ini
et ajoutez les lignes ci-dessous sous la ligne [mysqld]
comme ceci.
[mysqld]
innodb_file_format = Barracuda
innodb_large_prefix = 1
innodb_file_per_table = ON
Après cela, enregistrez vos modifications et redémarrez votre service MySQL.
Effectuez une restauration si vous en avez besoin, puis réexécutez votre migration.
Au cas où votre problème persisterait, accédez au fichier de configuration de votre base de données et définissez-le.
'engine' => null,
à 'engine' => 'innodb row_format=dynamic'
J'espère que ça aide!
Afin de (éviter de changer quoi que ce soit dans votre code}, simplement mettez à jour votre serveur MySQL vers au moins 5.7.7
Référence cette référence pour plus d'informations: https://laravel-news.com/laravel-5-4-key-too-long-error
Je pense que forcer StringLenght à 191 est une très mauvaise idée… Donc, je cherche à comprendre ce qui se passe.
J'ai remarqué que ce message d'erreur:
SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1071 Clé spécifiée était trop long; La longueur maximale de la clé est de 767 octets.
Commencé à apparaître après avoir mis à jour ma version de MySQL. J'ai donc vérifié les tables avec PHPMyAdmin et j'ai remarqué que toutes les nouvelles tables créées le faisaient avec la collation utf8mb4_unicode_ci au lieu de utf8_unicode_ci pour les anciennes.
Dans mon fichier de configuration de la doctrine, j'ai remarqué que charset était défini sur utf8mb4, mais toutes mes tables précédentes avaient été créées dans utf8. Je suppose donc que c'est une magie de mise à jour qui commence à fonctionner sur utf8mb4.
Maintenant, la solution la plus simple consiste à modifier le jeu de caractères de ligne dans votre fichier de configuration ORM . Ensuite, supprimez les tables à l’aide de utf8mb4_unicode_ci si vous êtes en mode dev ou fixez le jeu de caractères si vous ne pouvez pas les supprimer.
Pour Symfony 4
change charset: utf8mb4 en charset: utf8 dans config/packages/doctrine.yaml
Maintenant, ma doctrine les migrations fonctionnent à nouveau très bien.
Le travail abordé ici était de passer un deuxième paramètre avec le nom de clé (un nom court):
$table->string('my_field_name')->unique(null,'key_name');
Pour tous ceux qui pourraient être confrontés à cette situation, mon problème était que je créais une colonne de type string
et que je tentais de la créer ->unsigned()
alors que je voulais qu'elle soit un entier.
commencez par supprimer toutes les tables de la base de données dans l'hôte local
Remplacez les propriétés de la base de données Laravel default (utf8mb4) dans le fichier config/database.php par:
'charset' => 'utf8', 'collation' => 'utf8_unicode_ci',
after then Modification de mes propriétés de base de données locales utf8_unicode_ci. php artisan migrate c'est ok.
Changer mon type de serveur de base de données local de "mariadb" à "mysql" a corrigé cela pour moi sans avoir à modifier aucun fichier Laravel.
J'ai suivi ce tutoriel pour changer le type de mon serveur de base de données: https://odan.github.io/2017/08/13/xampp-replacing-mariadb-with-mysql.html
Je recevais cette erreur même si j'avais déjà (en fait parce que j'avais déjà) Schema :: defaultStringLength (191); dans mon fichier AppServiceProvider.php.
La raison en est que j'essayais de définir une valeur de chaîne dans l'une de mes migrations sur une valeur supérieure à 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();
});
Supprimer le 1000 ou le régler sur 191 a résolu mon problème.
Vous pouvez définir une longueur de chaîne du champ indexé comme suit:
$table->string('email', 200)->unique();
Pour Lumen:
Ajouter au fichier .env
DB_ENGINE=InnoDB