运行Console\cake schema create
时,CakePHP设置MySQL SQL模式的方式是什么?
非CakePHP等价物是使用PDO::MYSQL_ATTR_INIT_COMMAND
参数在PDO构造函数中运行此查询:
SET @@SESSION.sql_mode='TRADITIONAL,NO_AUTO_VALUE_ON_ZERO';
答案 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_CONFIG
类app/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';"
]