我意外启用了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','');
其他回答
最好是在新项目上使用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 = ''
这实际上清除了当前启用的所有模式。如果你不想弄乱其他设置,你可以做一个
SELECT @@sql_mode
首先,要获得一个以逗号分隔的启用模式列表,然后将其设置为该列表,而不使用ONLY_FUL_GROUP_BY选项。
我注意到@Eyo-Okon-Eyo解决方案只要MySQL服务器没有重启,默认设置就会恢复。这里有一个对我有效的永久解决方案:
要删除特定的SQL模式(在本例中为ONLY_FUL_GROUP_BY),请查找当前的SQL模式:
SELECT @@GLOBAL.sql_mode;
复制结果并从中删除不需要的内容(ONLY_FUL_GROUP_BY)
例如。:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
to
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
创建并打开此文件:
/etc/mysql/conf.d/disable_strict_mode.cnf
并将新的SQL模式写入其中:
[mysqld]
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:
sudo service mysql restart
或者您可以使用ANY_VALUE()抑制ONLY_FUL_GROUP_BY值拒绝,您可以在这里阅读更多信息
On:
Ubuntu 14.04mysql版本14.14 Distrib 5.7.16,适用于Linux(x86_64),使用EditLine包装器
Do:
$ sudo nano /etc/mysql/conf.d/mysql.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_SUBSTITUTION
到文件底部
$ sudo service mysql restart