在 CakePHP Schema 中设置 sql_mode

Set sql_mode in CakePHP Schema

运行 Console\cake schema create 时设置 MySQL 的 SQL 模式的 CakePHP 方法是什么?

非 CakePHP 等效项是使用 PDO::MYSQL_ATTR_INIT_COMMAND 参数在 PDO 构造函数中运行此查询:

SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';

您可以配置数据库源。

$config['flags'] = [
     PDO::MYSQL_ATTR_INIT_COMMAND => "SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';"
];

See the connect() methods code MySQL 驱动程序 class。

但是,当您同时使用 $config['encoding'] 时,这可能会成为一个问题...请参阅第 163 行。:( 这需要在核心中进行修复。

但您可以扩展此 class(MysqlExtended 或类似的东西)并根据需要更改它并使用它。只需重载 connect() 方法即可。然后使用此驱动程序代替原始驱动程序进行连接。

您可以 create/edit AppSchema 构造函数(请注意您的项目中可能有多个实例),获取数据源并执行查询:

class AppSchema extends CakeSchema {
    public function __construct($options = array()) {
        $db = ConnectionManager::getDataSource($this->connection);
        $db->execute("SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'");
        parent::__construct($options);
    }
}

这将使用所需的 SQL 模式加载您的架构。更具体地说,它将 不会 为应用程序本身强制执行给定的 SQL 模式。

可能的用例:

  • 严格检测早期错误

    SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'
    
  • 放宽设置加载不完整的示例数据

    SET @@SESSION.sql_mode=''
    

更笼统地说,您可以(我建议您这样做)通过在 DATABASE_CONFIG class 在 app/Config/database.php:

class DATABASE_CONFIG {
    public $default = array(
        'datasource' => 'Database/Mysql',
        // …
        'settings' => array(
            '@@SESSION.sql_mode' => "'TRADITIONAL,NO_AUTO_VALUE_ON_ZERO'",
        ),
    );
}

对于 app.php 中的 CakePHP 3,第 'Datasources' 部分,添加:

'flags' => [
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET @@SESSION.sql_mode='STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION';"
]