在CakePHP Schema中设置sql_mode

时间:2015-01-08 17:59:01

标签: php mysql cakephp cakephp-2.0

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

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

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

3 个答案:

答案 0 :(得分:3)

您可以配置数据库源。

$config['flags'] = [
     PDO::MYSQL_ATTR_INIT_COMMAND] => "SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';"
];
mysql驱动程序类的

See the connect() methods code

但是,当您同时使用$config['encoding']时,这可能会出现问题...请参阅第163行。:(这就是在核心中寻求修复。

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

答案 1 :(得分:1)

您可以创建/编辑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_CONFIGapp/Config/database.php上的相应属性来全局更改SQL模式:

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

答案 2 :(得分:0)

对于app.php中的CakePHP 3,部分'数据源',添加:

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