我意外启用了ONLY_FUL_GROUP_BY模式,如下所示:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
如何禁用它?
我意外启用了ONLY_FUL_GROUP_BY模式,如下所示:
SET sql_mode = 'ONLY_FULL_GROUP_BY';
如何禁用它?
当前回答
我使用mysql并注册了root用户,适合我的解决方案如下:
mysql>设置会话sql_mode=(SELECTREPLACE(@@sql_mode,'ONLY_FUL_GROUP_BY','');
其他回答
对于MySql 8,您可以尝试这个。(未在5.7中进行测试。希望它在那里也适用)
首先打开此文件
sudo vi/etc/mysql/my.cnf并将以下代码粘贴在上述文件的末尾
[mysqld]
sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
然后通过运行这个sudo服务mysql restart重新启动mysql
如果您使用的是MySQL 8.0.11,则需要从sql模式中删除“NO_AUTO_CREATE_USER”。
在/etc/mysql/my.cn文件和[mysqld]头中添加以下行
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
最好是在新项目上使用ONLY_FUL_GROUP_BY,同时在现有站点和数据库上保持向后兼容。为此,我选择在类中加载mysqli和PDO时修改SQL模式。
对于mysqli:
mysqli_query($this->link,"SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))");
对于PDO类:
PDO::MYSQL_ATTR_INIT_COMMAND => "SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
PDO初始化示例:
try {
$dns = 'mysql:host=localhost;dbname=' . $prod_db;
$user = _DBUSER_;
$pass = _DBPASS_;
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
PDO::MYSQL_ATTR_INIT_COMMAND => "SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))"
);
$db = new PDO($dns, $user, $pass, $options);
}
catch(Exception $e) {
mail("contact@xxxxxx.xx","Database Error ",$dns.",".$user);
echo "Unable ot connect to mySQL : ", $e->getMessage();
die();
}
因此,在同一服务器上创建的新类将使用新的数据库标准。
在我的sql(在Mac OS X上运行的5.7.11版本)上,我可以在mysql shell客户端上使用此功能:
SET
@@GLOBAL.sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
根据MySQL 5.6文档,sql_mode默认为
MySQL 5.6.5及其后版本中的空白字符串5.6.6中的NO_ENGINE_SUBSTITUTION、STRICT_TRANS_TABLES+
mysql 5.6参考
试试看:
SET sql_mode = ''
社区注意:正如下面的答案所指出的,这实际上清除了当前启用的所有SQL模式。这不一定是你想要的。