• 关于 truncate乱码 的搜索结果

回答

在MySQL 5.7之前,默认设置是允许non FULL group by。这意味着你可以有一组(使用聚合功能,如sum和max和count和group_concat)与其他非聚合列(让我们称他们NON AGGS)像你的第一个3所示不是所有的部分group by条款。它允许,但是结果通常是这样的: 它之所以奏效,是因为您非常了解自己的数据,并试图实现独特的 算是糟糕的事,因为那是个骗子 5.7之前的版本已ONLY_FULL_GROUP_BY存在,但默认情况下已关闭。 因此,在MySQL 5.7中,ONLY_FULL_GROUP_BY默认值为ON。因此,如果你试图GROUP BY,但不是所有的NON AGGS中group by条款,你会得到一个错误。 考虑下面的5.6中的以下问题: create table thing ( col1 int not null, col2 int not null, age int not null ); insert thing(col1,col2,age) values (1,2,10), (1,3,20), (2,3,20), (2,2,10); select col1,col2,max(age) from thing group by col1; +------+------+----------+ | col1 | col2 | max(age) | +------+------+----------+ | 1 | 2 | 20 | | 2 | 3 | 20 | +------+------+----------+ 上面发生的事情并不是全部NON AGGS在里面group by。它通过col1返回max(age)。但是由于col2不在中group by,它使用了簇索引或物理顺序,并在不经意间(一个天赋,一个错误)为col2带来了错误的值。根据您的意图或了解您的数据甚至是关心。引擎不在乎;也许你愿意。 为了避免这些常见错误或意外返回数据,MySQL 5.7 ONLY_FULL_GROUP_BY默认情况下处于打开状态。 在您的情况下,错误的行可能构成了第2列和第3列的结果。 请参见手册页,标题为MySQL BY GROUP。 例子2 -- drop table if exists person; create table person ( id int auto_increment primary key, firstName varchar(100) not null, lastName varchar(100) not null ); -- drop table if exists fruitConsumed; create table fruitConsumed ( id int auto_increment primary key, theDate date not null, fruitId int not null, -- does not really matter. Say, 1=apple, 2=orange from some other table personId int not null, qty int not null ); -- truncate table person; insert person (firstName,lastName) values ('Dirk','Peters'), ('Dirk','Smith'), ('Jane','Billings'); -- truncate table fruitConsumed; insert fruitConsumed (theDate,fruitId,personId,qty) values ('2016-10-31',1,1,2), ('2016-10-31',2,1,5), ('2016-10-31',2,2,12), ('2016-11-02',2,2,3); 查询: select p.firstName,p.lastName,sum(fc.qty) from person p join fruitConsumed fc on fc.personId=p.id group by p.firstName,p.lastName; +-----------+----------+-------------+ | firstName | lastName | sum(fc.qty) | +-----------+----------+-------------+ | Dirk | Peters | 7 | | Dirk | Smith | 15 | +-----------+----------+-------------+ 无论MySQL的设置如何,以上内容在MySQL 5.6和5.7上均可正常运行 ONLY_FULL_GROUP_BY 现在考虑 select p.firstName,p.lastName,sum(fc.qty) from person p join fruitConsumed fc on fc.personId=p.id group by p.firstName; +-----------+----------+-------------+ | firstName | lastName | sum(fc.qty) | +-----------+----------+-------------+ | Dirk | Peters | 22 | +-----------+----------+-------------+ 在没有ONLY_FULL_GROUP_BY启用MySQL 5.6的情况下,以上情况通常是可以接受的;在启用5.7的情况下,上述情况会失败ONLY_FULL_GROUP_BY(错误1055)。上面的输出基本上是乱码。但是下面对此进行了一些解释: 我们知道,德克,一个德克,只有一个德克,是唯一一个幸存于内部联接中的人。有2个德克。但是由于group by p.firstName,我们只剩下一个Dirk。我们需要一个lastName。由于不符合 SQL标准,因此MySQL可以ONLY_FULL_GROUP_BY将其关闭。因此,它只选择任何旧的姓氏。好吧,它找到的第一个,即在高速缓存中还是在物理顺序中。 彼得斯去了。水果计数总和适用于所有德克。 因此,如果您这样编码,则不合格的非合格品ONLY_FULL_GROUP_BY会给您带来乱码。 如前所述,MySQL 5.7出厂默认不允许。但是,如果您选择的话,可以对旧方法进行调整。 强烈建议您修复查询并保持ONLY_FULL_GROUP_BY启用状态。来源:stack overflow

保持可爱mmm 2020-05-17 20:46:05 0 浏览量 回答数 0

问题

【精品问答】数据库面试总结50问

茶什i 2019-12-01 21:57:36 221 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播