Laravel mysql 迁移错误
Laravel mysql migrate error
我最近格式化了我的 mac book pro,从 github 克隆了项目并安装了我需要的东西,比如 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 创建了数据库
在阅读 mysql 8.0 文档时,NO_AUTO_CREATE_USER 似乎已从 sql 模式中删除。我怀疑你的 my.cnf 有这个引用,应该从你的 conf 和内部的任何 mysql 设置中删除,然后你的 mysqld 重新启动。
请记住,我还没有升级到 mysql 8.0,只是在阅读文档。我很高兴使用 5.6.
https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html
Using GRANT to create users. Instead, use CREATE USER. Following this practice makes the NO_AUTO_CREATE_USER SQL mode immaterial for GRANT statements, so it too is removed.
几天前我终于找到了解决方案,我记住了这个post。
在 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',
],
],
实际上,您必须在 您与 mysql 驱动程序
的每个连接的末尾添加此代码
'modes' => [
'ONLY_FULL_GROUP_BY',
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_ENGINE_SUBSTITUTION',
],
我的问题是配置中的数据库名称拼写错误。
在文件中:
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';
我在将 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
后,一切都恢复正常了。
您的 MYSQL 版本不支持 SQL 模式。它在 8.0 版本中被删除。支持此 sql 模式的最后一个版本是 5.8。您的 MYSQL 版本可能是 8 或更高版本。 (Laravel 也应该更新)
从您的 config/database.php
文件中注释掉或删除该行
mysql' => [
...
'modes' => [
...
//'NO_AUTO_CREATE_USER',
],
MySQL 8 不支持。
我遇到了同样的问题,不得不使用较低的 MySQL 版本 (5.7)。
在 MySQL 8 中,选项“NO_AUTO_CREATE_USER”已从“sql_mode”参数中删除,Laravel 正在寻找它。
我今天遇到了与 mysql 8
、php 8
、laravel 8
相同的问题
解决方案
我刚刚更新了我的 config/database
文件,并在下面的部分
中将 strict
从 true
更改为 false
'mysql' => [
...
'prefix_indexes' => true,
'strict' => false,
'engine' => null,
...
],
它对我有用。
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'";
}
我最近格式化了我的 mac book pro,从 github 克隆了项目并安装了我需要的东西,比如 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 创建了数据库
在阅读 mysql 8.0 文档时,NO_AUTO_CREATE_USER 似乎已从 sql 模式中删除。我怀疑你的 my.cnf 有这个引用,应该从你的 conf 和内部的任何 mysql 设置中删除,然后你的 mysqld 重新启动。
请记住,我还没有升级到 mysql 8.0,只是在阅读文档。我很高兴使用 5.6.
https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html
Using GRANT to create users. Instead, use CREATE USER. Following this practice makes the NO_AUTO_CREATE_USER SQL mode immaterial for GRANT statements, so it too is removed.
几天前我终于找到了解决方案,我记住了这个post。
在 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',
],
],
实际上,您必须在 您与 mysql 驱动程序
的每个连接的末尾添加此代码'modes' => [
'ONLY_FULL_GROUP_BY',
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_ENGINE_SUBSTITUTION',
],
我的问题是配置中的数据库名称拼写错误。
在文件中:
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';
我在将 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
后,一切都恢复正常了。
您的 MYSQL 版本不支持 SQL 模式。它在 8.0 版本中被删除。支持此 sql 模式的最后一个版本是 5.8。您的 MYSQL 版本可能是 8 或更高版本。 (Laravel 也应该更新)
从您的 config/database.php
文件中注释掉或删除该行
mysql' => [
...
'modes' => [
...
//'NO_AUTO_CREATE_USER',
],
MySQL 8 不支持。 我遇到了同样的问题,不得不使用较低的 MySQL 版本 (5.7)。
在 MySQL 8 中,选项“NO_AUTO_CREATE_USER”已从“sql_mode”参数中删除,Laravel 正在寻找它。
我今天遇到了与 mysql 8
、php 8
、laravel 8
解决方案
我刚刚更新了我的 config/database
文件,并在下面的部分
strict
从 true
更改为 false
'mysql' => [
...
'prefix_indexes' => true,
'strict' => false,
'engine' => null,
...
],
它对我有用。
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'";
}