我在使用 Laravel 的查询构建器(DB
Facade)执行 sql 更新/插入时遇到问题。在表中插入一行时,我得到了
QueryException: Invalid datetime format: 1292 Incorrect date value: '0000-00-00' for column 'FoundationDate'.
当我将 SQL 语句复制到 PHPMyAdmin 时,它可以正常工作。我知道这取决于 sql_mode
设置。我检查了这个变量,没有启用严格模式!那么,这怎么可能在 PHPMyAdmin 上有效,而在 Laravel 中却不能呢?
我正在使用 Mysql 5.5.49 和 Laravel 5.3。
提前致谢!
最佳答案
对于 Laravel 5.3,sql_mode 在运行时通过 Illuminate\DatabaseConnectors\MySqlConnector@setModes
设置:
/**
* Set the modes for the connection.
*
* @param \PDO $connection
* @param array $config
* @return void
*/
protected function setModes(PDO $connection, array $config)
{
if (isset($config['modes'])) {
$modes = implode(',', $config['modes']);
$connection->prepare("set session sql_mode='{$modes}'")->execute();
} elseif (isset($config['strict'])) {
if ($config['strict']) {
$connection->prepare("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'")->execute();
} else {
$connection->prepare("set session sql_mode='NO_ENGINE_SUBSTITUTION'")->execute();
}
}
}
注意 sql_mode 的 NO_ZERO_DATE
是在该方法中设置的。可以通过向 mysql 连接添加 modes
键来更改 config.database.php 文件中的 sql_mode,如下所示:
'connections' => [
'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', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
'modes' => [],
],
]
您可以将 modes
保留为一个空数组,也可以根据需要对其进行配置。更多信息 here
或者,您可以只设置 strict => false,
关于mysql - Laravel 不正确的日期值 sql_mode 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41716244/