当我们把MySQL的版本升级到5.7时,在使用WordPress导数据时,可能会出现1067错误的情况,这个错误是由于MySQL5.7对于GROUP BY的强度校验增加导致的。以下是具体的解决攻略:
问题分析
在MySQL5.7中,增加了对GROUP BY语句的严格校验,要求GROUP BY子句中的所有列都必须在SELECT中出现,或者是使用聚合函数。而在早期的版本中,这种情况下也可以正常查询,但是在MySQL5.7中,这就会导致语法错误的发生。
在WordPress导数据时,可能会遇到类似的SQL语句,例如:
SELECT post_date,post_title, post_content,comment_status,ping_status,post_password, post_name,post_status,post_type,COUNT(pm.meta_id) AS comments_count FROM wp_posts LEFT JOIN wp_postmeta pm ON ( wp_posts.ID = pm.post_id) WHERE (post_type = 'post') AND (post_status = 'publish') GROUP BY wp_posts.ID ORDER BY post_date DESC LIMIT 0, 10;
这段SQL语句中使用了GROUP BY语句,但是其中的post_title、post_content、post_password字段在SELECT语句中没有出现,而且也没有使用聚合函数。这就导致了在MySQL5.7中运行时会报错1067。
解决方法
让GROUP BY符合MYSQL 5.7要求的方法主要是将非GROUP BY的字段添加进GROUP BY中或者使用聚合函数。这里我们有两种解决方法:
方法一:调整MySQL的校验级别
将MySQL的执行校验级别调整为MYSQL5.6 Compatible,可以保证你的数据库在认真考虑升级时获得更好的兼容性。在连接MySQL之后,运行以下命令即可:
SET @@global.sql_mode= '';
这会覆盖默认的SQL模式,使用MySQL5.6兼容性的模式执行。接下来再运行导数据的操作即可。
方法二:修改SQL语句
修改SQL语句,使得其中的GROUP BY语句符合MYSQL5.7的要求。对于WordPress导数据的情况,我们可以直接修改wp-includes/wp-db.php中的部分代码。
打开wp-db.php文件,找到下面的代码:
$orderby_array[] = "{$groupby} ASC";
改为:
$orderby_array[] = "MIN({$groupby}) ASC";
这样就可以在GROUP BY语句中使用聚合函数MIN,以保证GROUP BY符合MYSQL5.7的校验要求了。接下来重试导数据操作即可。
示例说明
下面是两个示例,帮助读者更好的理解如何使用上述方法修复WordPress中的数据导入问题:
示例一:修改SQL语句
假设我们在WordPress中执行了如下的SQL操作:
$posts = $wpdb->get_results("SELECT post_date,post_title,post_content,comment_status,ping_status,post_password, post_name,post_status,post_type,COUNT(pm.meta_id) AS comments_count FROM wp_posts LEFT JOIN wp_postmeta pm ON ( wp_posts.ID = pm.post_id) WHERE (post_type = 'post') AND (post_status = 'publish') GROUP BY wp_posts.ID ORDER BY post_date DESC LIMIT 0, 10");
这条SQL语句中使用了GROUP BY语句,但是其中的post_title、post_content、post_password等字段在SELECT语句中没有出现,导致在MySQL5.7中执行时会报错1067。
为了解决这个问题,我们可以直接修改wp-includes/wp-db.php中的代码,将其中的$orderby_array[] = "{$groupby} ASC";改为$orderby_array[] = "MIN({$groupby}) ASC";。这样就可以在GROUP BY语句中使用聚合函数MIN,来保证GROUP BY符合MYSQL5.7的校验要求了。
示例二:调整MySQL的校验级别
假设我们在升级MySQL5.7之后,依旧希望使用原有的SQL语句进行数据导入操作。此时可以通过调整MySQL的校验级别来解决问题。
首先连接MySQL数据库,然后运行以下命令来将MySQL的执行模式调整为MYSQL5.6 Compatible:
SET @@global.sql_mode= '';
这会将MySQL的执行模式调整为MYSQL5.6 Compatible,可以让原有的SQL语句正常运行。接下来重试导入数据操作即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql升级到5.7时,wordpress导数据报错1067的问题 - Python技术站