66 votes

Erreur de migration de Laravel mysql

J'ai récemment formaté mon mac book pro, après avoir cloné le projet depuis github et installé les choses dont j'ai besoin comme MySql et Sequel Pro, j'ai essayé de migrer les informations de la base de données mais j'ai obtenu cette erreur :

   Illuminate\Database\QueryException  : SQLSTATE[42000]: Erreur de syntaxe ou violation d'accès: 1231 La variable 'sql_mode' ne peut pas être définie à la valeur 'NO_AUTO_CREATE_USER' (SQL : select * from information_schema.tables where table_schema = fisica and table_name = migrations)

  Trace de l'exception:

  1   PDOException::("SQLSTATE[42000]: Erreur de syntaxe ou violation d'accès: 1231 La variable 'sql_mode' ne peut pas être définie à la valeur 'NO_AUTO_CREATE_USER'")

Versions:

Mysql 8.0.11

Laravel 5.6.12

PHP 7.1.14 (cli)

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=fisica
DB_USERNAME=xxx
DB_PASSWORD=xxx

J'ai créé la base de données à partir de l'interface graphique de Sequel PRO

0 votes

0 votes

Il semble que vous devez faire quelque chose comme (en tant qu'utilisateur root) : GRANT ALL ON fisica.* TO 'nom_utilisateur_ici'@'127.0.0.1' IDENTIFIED BY 'mot_de_passe_ici'; FLUSH PRIVILEGES;

1 votes

Pouvez-vous ajouter la partie supérieure de votre fichier dump à votre question?

186voto

Julian Mendez Points 1274

J'ai enfin trouvé les solutions il y a quelques jours et j'ai pensé à ce message. Dans le fichier config/database.php sous la balise mysql, les modes sql doivent être ajoutés pour éviter cette erreur. https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-full

Mon tableau MySQL s'est finalement retrouvé comme ceci:

    '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,
        'modes'  => [
            'ONLY_FULL_GROUP_BY',
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_ENGINE_SUBSTITUTION',
        ],
    ],

6 votes

Pour moi, j'ai juste eu à ajouter la clé modes et les valeurs du tableau à ma configuration.

2 votes

J'ai MySQL 8, et en ajoutant cette balise "modes" tout fonctionnait correctement. Merci!

0 votes

Je me demande s'il y a une autre commande qui doit être exécutée après avoir ajouté les modes au tableau de connexion avant que cela fonctionne, j'ai ajouté les modes et ai essayé d'exécuter php artisan migrate mais je me heurte à la même erreur

26voto

Efrén Points 21

Dans le fichier :

config/database.php

'mysql' =[
    ...
    'strict' => false
]

Désactive également le sql_mode

via SQL :

SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';

via my.cnf à l'intérieur de l'entête [mysqld]

sql_mode=NO_ENGINE_SUBSTITUTION

Testez les changements :

SHOW VARIABLES LIKE 'sql_mode';

0 votes

Strict => false l'a corrigé pour moi. et il est beaucoup plus facile à retenir que de définir le tableau "modes". Merci.

0 votes

C'est bien, ça fonctionne pour moi, il suffit de changer pour false. Merçi

11voto

eValdezate Points 269

En effet, vous devez ajouter ce code à la fin de chacune des connexions que vous avez avec le pilote mysql

'modes' => [
     'ONLY_FULL_GROUP_BY',
     'STRICT_TRANS_TABLES',
     'NO_ZERO_IN_DATE',
     'NO_ZERO_DATE',
     'ERROR_FOR_DIVISION_BY_ZERO',
     'NO_ENGINE_SUBSTITUTION',
],

6voto

J'ai vécu la situation ci-dessus après avoir mis à niveau Laravel de 5.3 à 5.7, avec lequel il fonctionnait précédemment avec MySQL 8 sans aucun problème. La réponse acceptée ne fonctionnait pas pour moi et après avoir cherché sur Google, je n'ai pas trouvé de solution. Ce qui a fonctionné pour moi a été de rechercher dans le dossier de mon projet

grep -rnw 'Chemin_vers_votre_dossier_de_projet' -e 'sql_mode'

Ce qui m'a conduit à

~/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php:183: return "set session sql_mode='ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION'";

Une fois que j'ai retiré NO_AUTO_CREATE_USER de la liste, tout a fonctionné à nouveau.

0 votes

Je sais que c'est vieux, mais je suis tombé dessus aujourd'hui, après avoir essayé toutes les solutions énumérées ci-dessus, c'est la seule chose qui a fonctionné pour moi. Ce n'est pas la meilleure idée de modifier les fichiers du fournisseur, mais c'est local (alors que le live est en cours d'exécution mysql5.6 donc tout va bien pour moi :) )

3voto

Dom Points 836

En lisant la documentation de mysql 8.0, il semble que le mode NO_AUTO_CREATE_USER ait été supprimé de sql-mode. Je soupçonne que votre fichier my.cnf fait référence à cela et devrait être supprimé de votre configuration ainsi que de tout paramètre mysql interne et votre mysqld redémarré.

Gardez à l'esprit que je n'ai pas mis à niveau vers mysql 8.0 et je lis simplement la documentation. Je suis content d'utiliser la version 5.6.

https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html

Utiliser GRANT pour créer des utilisateurs. Au lieu de cela, utilisez CREATE USER. En suivant cette pratique, le mode SQL NO_AUTO_CREATE_USER devient sans importance pour les instructions GRANT, il est donc également supprimé.

1 votes

Une combinaison de cela et de la réponse de @eValdezate m'a aidé

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X