mysql - Laravel 不正确的日期值 sql_mode 为空

标签 mysql sql laravel laravel-5 laravel-5.3

我在使用 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/

相关文章:

laravel - 运行Laravel队列:work on a shared hosting

php - 在 foreach 循环中使用 SQL 结果

mysql - mysql中的if..then语句

sql - 哪些代码在数据库中有对应关系

php - 选择每种类型的多个项目

php - Laravel Beyondcode websockets - 如果 verify_peer 为真则不起作用

laravel - 如何在 Laravel 中发送带有文件和数据数组的 PUT 请求

php - 简单的插入语句在 php 代码中不起作用。在 MySQL Workbench 上运行

PHP 不再投票一次,我如何在我的代码中编写此代码?

mysql - 通过查询在两个组之间自然连接