在CakePHP模式中设置sql_mode

bwleehnv  于 2022-11-12  发布在  PHP
关注(0)|答案(3)|浏览(145)

运行Console\cake schema create时,CakePHP如何设置MySQL的SQL模式?
非CakePHP的等效方法是使用PDO::MYSQL_ATTR_INIT_COMMAND参数在PDO构造函数中运行此查询:

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

ryevplcw1#

您可以配置数据库源。

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

请参见MySQL驱动程序类的connect()方法代码。
但是当您同时使用$config['encoding']时,这可能是一个问题...请参见第163行。:(这需要在核心中进行修复。
但是你可以扩展这个类(MysqlExtended或类似的东西),根据需要改变它并使用它。只需要重载connect()方法。然后使用这个驱动程序而不是原来的连接。

vx6bjr1n

vx6bjr1n2#

您可以创建/编辑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=''

更一般地说,您可以(我建议您这样做)通过编辑app/Config/database.php处的DATABASE_CONFIG类中的相应属性来全局更改整个连接的SQL模式:

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

ar5n3qh53#

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

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

相关问题