MySQL中使用group by是总是出现1055的错误(推荐)

  

因为在MySQL中使用group by是总是出现1055的错误,这就导致了必须去查看是什么原因了,查询了相关的资料,现在将笔记记录下来,以便后面可以参考使用:

  

sql_mode:简而言之就是:它定义了你MySQL应该支持的sql语法,对数据的校验等等

  

选择@@sql_mode:使用该命令我们可以查看我们当前数据库的sql_mode

        mysql>选择@@sql_mode;   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | @@sql_mode |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   |>   mysql>从tt1 select *;   + - - - + - - - - - - - - - - - - - - - - - +   性别| | | | id名称   + - - - + - - - - - - - - - - - - - - - - - +   | 1 | xiong | 0 |   | 2 |应| 0 |   | 3 | cai | 0 |   张| 4 | | 0 |   李| 5 | | 1 |   王| 6 | | 1 |   + - - - + - - - - - - - - - - - - - - - - - +   6行集(0.00秒)      mysql>选择id、名称从tt1组的名字;   错误1055 (42000):      mysql>从tt1 select *;   + - - - + - - - - - - - - - - - - - - - - - +   性别| | | | id名称   + - - - + - - - - - - - - - - - - - - - - - +   | 1 | xiong | 0 |   | 2 |应| 0 |   | 3 | cai | 0 |   张| 4 | | 0 |   李| 5 | | 1 |   王| 6 | | 1 |   + - - - + - - - - - - - - - - - - - - - - - +   6行集(0.00秒)   mysql>选择的名字从tt1集团的名字;   +-------+   | |名称   +-------+   蔡| |   李| |   王| |   | xiong |   应| |   张| |   +-------+   6行集(0.00秒)      

所以我们要使用能正确的使用集团的话就必须删除掉only_full_group_by

        设置sql_mode=(选择替换(@@sql_mode,‘ONLY_FULL_GROUP_BY’,”);可以使用该语句来将空格替换掉only_full_group_by,这样我们就可以使用      mysql>设置sql_mode=(选择替换(@@sql_mode,‘ONLY_FULL_GROUP_BY’,”);   查询好,0行影响(0.00秒)      mysql>选择id、名称从tt1组的名字;   + - - - + - - - - - - - +   | | | id名称   + - - - + - - - - - - - +   | 3 | cai |   李| 5 | |   王| 6 | |   | 1 | |汽车   应| 2 | |   张| 4 | |   + - - - + - - - - - - - +   6行集(0.00秒)      

但是这种方法只是做了暂时的修改,我们可以更改配置文件my.ini

        sql_mode=STRICT_TRANS_TABLES、NO_ZERO_IN_DATE NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION      

STRICT_TRANS_TABLES:

  

在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制

  

NO_ZERO_IN_DATE:

  

在严格模式,不接受月或日部分为0的日期。如果使用忽略选项,我们为类似的日期插入‘0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。

  

NO_ZERO_DATE:

  

在严格模式,不要将“0000-00-00”做为合法日期。你仍然可以用忽略选项插入零日期。在非严格模式,可以接受该日期,但会生成警告

  

ERROR_FOR_DIVISION_BY_ZERO:

  

在严格模式,在插入或更新过程中,如果被零除(或国防部(X, 0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回零。如果用到插入忽略或更新忽略中,MySQL生成被零除警告,但操作结果为空

        NO_AUTO_CREATE_USER:      

防止格兰特自动创建新用户,除非还指定了密码。

        NO_ENGINE_SUBSTITUTION:      

如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

  

三,据说是MySQL5.0以上版本支持三种sql_mode模式:ANSI、传统和STRICT_TRANS_TABLES。

  

1, ANSI模式:宽松模式,更改语法和行为,使其更符合标准SQL。对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报预警警告。对于本文开头中提到的错误,可以先把sql_mode设置为ANSI模式,这样便可以插入数据,而对于除数为0的结果的字段值,数据库将会用NULL值代替。将当前数据库模式设置为ANSI模式:

MySQL中使用group by是总是出现1055的错误(推荐)