2023-05-10 08:00:02

禁用ONLY_FUL_GROUP_BY

我意外启用了ONLY_FUL_GROUP_BY模式,如下所示:

SET sql_mode = 'ONLY_FULL_GROUP_BY';

如何禁用它?


当前回答

更新:

要保持当前mysql设置并禁用ONLY_FUL_GROUP_BY,我建议访问phpmyadmin或您正在使用的任何客户端并键入:

SELECT REPLACE(@@sql_mode,'ONLY_FUL_GROUP_BY','')copy_me

下一个将结果复制到my.ini文件。

薄荷:sudo nano/etc/mysql/my.cnf

ubuntu 16及以上:sudo nano/etc/mysql/my.cnf

ubuntu 14-16:/etc/mysql/mysql.conf.d/mysqld.cnf

小心copy_me结果可以包含一个长文本,默认情况下可以对其进行修剪。确保复制整个文本!


旧答案:

如果要永久禁用错误“SELECT列表的表达式#N不在GROUP BY子句中,并且包含非聚合列“db.table.COL”,该列在功能上不依赖GROUP BY子句的列;这与sql_mode=only_full_GROUP_BY不兼容”,请执行以下步骤:

sudo nano/etc/mysql/my.cnf将此添加到文件末尾[mysqld]sql_mode=“STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSITION”sudo服务mysql重启以重启mysql

这将为所有用户禁用ONLY_FUL_GROUP_BY

其他回答

试试看:

SET sql_mode = ''

社区注意:正如下面的答案所指出的,这实际上清除了当前启用的所有SQL模式。这不一定是你想要的。

MySQL文档还指定了以下方法:

在选项文件(如my.cnf(Unix操作系统)或my.ini(Windows))中设置sql mode=“<mode>”。要通过命令行在服务器启动时设置SQL模式,请使用--SQL mode=“<modes>”选项。

*其中<modes>是用逗号分隔的不同模式列表。

要显式清除SQL模式,请在命令行上使用--sqlmode=“”或在选项文件中使用sqlmode=”将其设置为空字符串。

我在/etc/my.cnf中添加了sqlmode=“”选项,并成功了。

这个SO解决方案讨论了找出MySQL正在使用哪个my.cnf文件的方法。

进行更改后不要忘记重新启动MySQL。

这是我在Mysql工作台上修复的操作:

在我使用以下命令获得当前值之前

SELECT @@sql_mode 

后来,我从列表中删除了ONLY_FUL_GROUP_BY键,并粘贴了以下命令

SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

在我的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参考

最好是在新项目上使用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();
} 

因此,在同一服务器上创建的新类将使用新的数据库标准。