【问题标题】:Laravel mysql migrate errorLaravel mysql迁移错误
【发布时间】:2018-10-01 15:16:30
【问题描述】:

我最近格式化了我的 mac book pro,从 github 克隆了 proyect 并安装了我需要的东西,比如 MySql 和 Sequel Pro,我试图迁移数据库信息,但是我收到了这个错误:

   Illuminate\Database\QueryException  : SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER' (SQL: select * from information_schema.tables where table_schema = fisica and table_name = migrations)

  Exception trace:

  1   PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'")

版本:

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

我从 Sequel PRO GUI 创建了数据库

【问题讨论】:

  • 似乎你需要做一些类似的事情(作为 root 用户):GRANT ALL ON fisica.* TO 'username_here'@'127.0.0.1' IDENTIFIED BY 'password_here'; FLUSH PRIVILEGES;
  • 您能否将转储文件的顶部添加到您的问题中?
  • @DavidBrossard 我有 mysql 8.0.11 所以,我不这么认为。
  • @num8er 我会试试的!

标签: php mysql laravel laravel-5.6


【解决方案1】:

在阅读 mysql 8.0 文档时,看起来 NO_AUTO_CREATE_USER 已从 sql-mode 中删除。我怀疑你的 my.cnf 有这个引用,应该从你的 conf 和内部的任何 mysql 设置中删除,你的 mysqld 重新启动。

请记住,我还没有升级到 mysql 8.0,只是在阅读文档。我很高兴使用 5.6。

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

使用 GRANT 创建用户。相反,使用创建用户。遵循这种做法会使 NO_AUTO_CREATE_USER SQL 模式对 GRANT 语句无关紧要,因此它也被删除了。

【讨论】:

  • @eValdezate 的回答对我有帮助
【解决方案2】:

我终于在几天前找到了解决方案,我记得这篇文章。 在 mysql 标签中的config/database.php 文件中,应添加 sql 模式以跳过此错误。 https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-full

我的 MySQL 数组最终是这样的:

    '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',
        ],
    ],

【讨论】:

  • 对我来说,我只需要将 modes 键和数组值添加到我的配置中。
  • 我有 MySQL 8,添加这个标签“模式”都可以正常工作。谢谢!
  • 我想知道在此工作之前将模式添加到连接数组后是否需要运行任何其他命令,我添加了模式并尝试运行 php artisan migrate 但我遇到了同样的错误
  • 之后使用命令:php artisan config:cache
  • 别忘了运行 composer dump-autoload
【解决方案3】:

实际上,您必须在您与 mysql 驱动程序的每个连接的末尾添加此代码

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

【讨论】:

    【解决方案4】:

    我的问题是配置中的数据库名称拼写错误。

    【讨论】:

      【解决方案5】:

      在文件中:

      config/database.php

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

      同时禁用 sql_mode

      通过 SQL:

      SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
      

      通过 my.cnf 在标题[mysqld]

      sql_mode=NO_ENGINE_SUBSTITUTION
      

      测试更改:

      SHOW VARIABLES LIKE 'sql_mode';
      

      【讨论】:

      • strict => false 为我修复了它。并且比设置“模式”数组更容易记住。谢谢。
      • 很好,它对我有用,只需更改为 false。 Tks
      【解决方案6】:

      我在将 laravel 从 5.3 升级到 5.7 后遇到了上述情况,之前它可以使用 MySQL 8 没有任何问题,接受的答案对我不起作用,在谷歌搜索后我没有找到解决方案。对我有用的是搜索我的项目文件夹

      grep -rnw 'Location_to_your_project_folder' -e 'sql_mode'
      

      这导致我

      ~/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'";
      

      一旦我从列表中删除了NO_AUTO_CREATE_USER,一切都恢复正常了。

      【讨论】:

      • 我知道这是旧的,但我今天遇到了这个,在尝试了上面列出的所有解决方案之后,这是唯一对我有用的东西。编辑供应商文件不是最好的主意,但这是本地的(因为 live 正在运行 mysql5.6,所以对我来说一切都好:))
      【解决方案7】:

      您的 MYSQL 版本不支持该 SQL 模式。它在 8.0 版中被删除。支持这种 sql 模式的最后一个版本是 5.8。您的 MYSQL 版本可能是 8 或更高版本。 (Laravel 也应该更新)

      从您的config/database.php 文件中注释掉或删除该行

      mysql' => [
        ...
        'modes' => [
          ...
          //'NO_AUTO_CREATE_USER',
      ],
      

      【讨论】:

        【解决方案8】:

        不支持 MySQL 8。 我遇到了同样的问题,不得不使用较低的 MySQL 版本(5.7)。

        在 MySQL 8 中,选项“NO_AUTO_CREATE_USER”已从“sql_mode”参数中删除,Laravel 正在寻找它。

        【讨论】:

          【解决方案9】:

          我今天遇到了同样的问题,mysql 8php 8laravel 8

          解决方案

          我刚刚更新了我的config/database 文件并在下一节中将stricttrue 更改为false

              'mysql' => [
                  ...
                  'prefix_indexes' => true,
                  'strict' => false,
                  'engine' => null,
                  ...
              ],
          

          它对我有用。

          【讨论】:

            【解决方案10】:

            Laravel 5.5 及更高版本尝试自动检测 mysql 服务器版本,如果 mysql 8.0.11 或更高版本,它会从模式中忽略 NO_AUTO_CREATE_USER。但是,在我的情况下,它错误地将版本检测为5.6.47.0。在 laravel 7 中,他们添加了通过在 config/database.php 中手动设置版本来覆盖版本检查的功能

            'mysql' => [
                // ...
                'strict' => true,
                'version' => '8.0.11',
            ]
            

            在低于 7.x 的 laravel 版本上,最简单的解决方案是设置 'strict' => false

            Illuminate/Database/Connectors/MySqlConnector.php

            protected function strictMode(PDO $connection, $config)
            {
                $version = $config['version'] ?? $connection->getAttribute(PDO::ATTR_SERVER_VERSION);
            
                if (version_compare($version, '8.0.11') >= 0) {
                    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_ENGINE_SUBSTITUTION'";
                }
            
                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'";
            }
            

            【讨论】:

              猜你喜欢
              • 2018-12-06
              • 2018-06-05
              • 1970-01-01
              • 2020-08-16
              • 1970-01-01
              • 1970-01-01
              • 2014-06-10
              • 2015-12-19
              相关资源
              最近更新 更多