'a' or 'b'/ 'a' and 'b'为什么符合语法,具体做了什么操作,实践中有什么用

gikod 2016-04-24 02:22:51
看到一个帖子里出的错误是把col in ('a', 'b')写成'a' or 'b'
http://bbs.csdn.net/topics/391939390
那么问题来了,mysql在parse中允许对字符串做这样的语法,是什么目的,为什么符合语法,具体做了什么操作,实践中有什么用呢?百思不得其JIE

MariaDB [demo]> select 'a' or 'b';
+------------+
| 'a' or 'b' |
+------------+
| 0 |
+------------+
1 row in set, 4 warnings (0.00 sec)

MariaDB [demo]> select 'a' and 'b';
+-------------+
| 'a' and 'b' |
+-------------+
| 0 |
+-------------+
1 row in set, 3 warnings (0.00 sec)
...全文
207 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gikod 2016-04-26
  • 打赏
  • 举报
回复
更新一下进展,这个语法是发生了字符->数字的转换,但转换不成功也不抱错,只是警告。 而sql_mode为什么不能指定这样的转换失败报错,难道是ANSI的规定吗,有谁熟吗?

MariaDB [demo]> select 'a' or 'b';
+------------+
| 'a' or 'b' |
+------------+
|          0 |
+------------+
1 row in set, 4 warnings (0.00 sec)

MariaDB [demo]> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'a' |
| Warning | 1292 | Truncated incorrect INTEGER value: 'b' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'a'  |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'b'  |
+---------+------+----------------------------------------+
4 rows in set (0.00 sec)

MariaDB [demo]> set sql_mode = 'TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)

MariaDB [demo]> select 'a' or 'b';
+------------+
| 'a' or 'b' |
+------------+
|          0 |
+------------+
1 row in set, 4 warnings (0.00 sec)

MariaDB [demo]> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'a' |
| Warning | 1292 | Truncated incorrect INTEGER value: 'b' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'a'  |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'b'  |
+---------+------+----------------------------------------+
4 rows in set (0.00 sec)

MariaDB [demo]> set sql_mode = 'ANSI';
Query OK, 0 rows affected (0.00 sec)

MariaDB [demo]> select 'a' or 'b';
+------------+
| 'a' or 'b' |
+------------+
|          0 |
+------------+
1 row in set, 4 warnings (0.00 sec)

MariaDB [demo]> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'a' |
| Warning | 1292 | Truncated incorrect INTEGER value: 'b' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'a'  |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'b'  |
+---------+------+----------------------------------------+
4 rows in set (0.00 sec)
gikod 2016-04-26
  • 打赏
  • 举报
回复
引用 9 楼 gikod 的回复:
更新一下进展,这个语法是发生了字符->数字的转换,但转换不成功也不抱错,只是警告。 而sql_mode为什么不能指定这样的转换失败报错,难道是ANSI的规定吗,有谁熟吗?
自己顶一下,终于定位到根本问题了。 不是parse的问题,而是关于类型转换异常没有处理。 我试了几个sql_mode,似乎这几个都不管用。 有什么办法把这个转换异常变成error吗?
LongRui888 2016-04-25
  • 打赏
  • 举报
回复
引用 2 楼 gikod 的回复:
[quote=引用 1 楼 yupeigu 的回复:] 我刚才在sql server上试了一下这个语法是会报错的。 所以,这个语法应该是mysql特有的,至于这个语句这么写,是否有实际的意义,这个好不好说,不了解mysql的开发者,是出于什么样的需要,才实现了这种语法。 不过,从实际开发的过程中,基本上不需要用这种语法,实际也从来没有用到过
是吧,我用Oracle比较多,也不能这么用,真是惊叹MySQL的神奇。 所以问问精通MySQL的大家,这个语法是做什么用的,最好有精通MySQL源码的大咖聊聊一下parser这么做了之后ast执行时做了什么。[/quote] 说到这里,还有一个 mysql特有的语法: select * from xx group by id 这个语法也能运行。这个语句就很有用处
gikod 2016-04-25
  • 打赏
  • 举报
回复
引用 1 楼 yupeigu 的回复:
我刚才在sql server上试了一下这个语法是会报错的。 所以,这个语法应该是mysql特有的,至于这个语句这么写,是否有实际的意义,这个好不好说,不了解mysql的开发者,是出于什么样的需要,才实现了这种语法。 不过,从实际开发的过程中,基本上不需要用这种语法,实际也从来没有用到过
是吧,我用Oracle比较多,也不能这么用,真是惊叹MySQL的神奇。 所以问问精通MySQL的大家,这个语法是做什么用的,最好有精通MySQL源码的大咖聊聊一下parser这么做了之后ast执行时做了什么。
LongRui888 2016-04-25
  • 打赏
  • 举报
回复
我刚才在sql server上试了一下这个语法是会报错的。 所以,这个语法应该是mysql特有的,至于这个语句这么写,是否有实际的意义,这个好不好说,不了解mysql的开发者,是出于什么样的需要,才实现了这种语法。 不过,从实际开发的过程中,基本上不需要用这种语法,实际也从来没有用到过
gikod 2016-04-25
  • 打赏
  • 举报
回复
引用 7 楼 ACMAIN_CHM 的回复:
gikod 结帖率:0% 当您的问题得到解答后请及时结贴. http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html 8、如何给分和结贴? http://bbs.csdn.net/help#post_dispose
谢谢提醒,第一次在csdn发问题,聊得跑题了,Sorry。 btw, 等看到答案我的结帖率就会100%了。 yupeigu兄弟刚才聊到的group by用法,找个什么别的方法(比如再开个贴),再把分给他吧。 主要还是想知道这段提问的答案:
引用 楼主 gikod 的回复:
mysql在parse中允许对字符串做('a' or 'b')这样的语法,是什么目的,为什么符合语法,具体做了什么操作,实践中有什么用呢?
引用 楼主 gikod 的回复:
所以问问精通MySQL的大家,这个语法是做什么用的,最好有精通MySQL源码的大咖聊聊一下parser这么做了之后ast执行时做了什么。
如果ACMAIN_CHM版主明白,也请帮个忙,谢啦!
gikod 2016-04-25
  • 打赏
  • 举报
回复
似乎功能是除了group by 的列和aggregate函数以外,还可以带出其他列的一个值。 只是那个列上会有多个值,从中取哪一个有规律可循是吧。
LongRui888 2016-04-25
  • 打赏
  • 举报
回复
引用 4 楼 gikod 的回复:
[quote=引用 3 楼 yupeigu 的回复:] [quote=引用 2 楼 gikod 的回复:] [quote=引用 1 楼 yupeigu 的回复:] 我刚才在sql server上试了一下这个语法是会报错的。 所以,这个语法应该是mysql特有的,至于这个语句这么写,是否有实际的意义,这个好不好说,不了解mysql的开发者,是出于什么样的需要,才实现了这种语法。 不过,从实际开发的过程中,基本上不需要用这种语法,实际也从来没有用到过
是吧,我用Oracle比较多,也不能这么用,真是惊叹MySQL的神奇。 所以问问精通MySQL的大家,这个语法是做什么用的,最好有精通MySQL源码的大咖聊聊一下parser这么做了之后ast执行时做了什么。[/quote] 说到这里,还有一个 mysql特有的语法: select * from xx group by id 这个语法也能运行。这个语句就很有用处[/quote] 好神奇的语法, 别卖关子,说说能用来做什么?

MariaDB [demo]> select * from t;
+----+------+------+
| id | val  | val2 |
+----+------+------+
|  1 |    1 | NULL |
|  2 |    2 | NULL |
|  3 |    3 | NULL |
|  4 |    4 | NULL |
|  5 |    5 | NULL |
|  6 |    1 |    1 |
|  7 |    2 |    2 |
|  8 |    3 |    3 |
|  9 |    4 |    4 |
| 10 |    5 |    5 |
+----+------+------+
10 rows in set (0.00 sec)

MariaDB [demo]> select * from t group by id;
+----+------+------+
| id | val  | val2 |
+----+------+------+
|  1 |    1 | NULL |
|  2 |    2 | NULL |
|  3 |    3 | NULL |
|  4 |    4 | NULL |
|  5 |    5 | NULL |
|  6 |    1 |    1 |
|  7 |    2 |    2 |
|  8 |    3 |    3 |
|  9 |    4 |    4 |
| 10 |    5 |    5 |
+----+------+------+
10 rows in set (0.00 sec)

MariaDB [demo]> select * from t group by val;
+----+------+------+
| id | val  | val2 |
+----+------+------+
|  1 |    1 | NULL |
|  2 |    2 | NULL |
|  3 |    3 | NULL |
|  4 |    4 | NULL |
|  5 |    5 | NULL |
+----+------+------+
5 rows in set (0.00 sec)

MariaDB [demo]> select * from t group by val2;
+----+------+------+
| id | val  | val2 |
+----+------+------+
|  1 |    1 | NULL |
|  6 |    1 |    1 |
|  7 |    2 |    2 |
|  8 |    3 |    3 |
|  9 |    4 |    4 |
| 10 |    5 |    5 |
+----+------+------+
6 rows in set (0.00 sec)
[/quote] 一般用来求某个数据中,最新的数据,比如张三 ,在1号上传了1条数据,3号上传了一条数据, 通过这个语法,可以比较容易的求出张三在3号上传的数据
gikod 2016-04-25
  • 打赏
  • 举报
回复
引用 3 楼 yupeigu 的回复:
[quote=引用 2 楼 gikod 的回复:] [quote=引用 1 楼 yupeigu 的回复:] 我刚才在sql server上试了一下这个语法是会报错的。 所以,这个语法应该是mysql特有的,至于这个语句这么写,是否有实际的意义,这个好不好说,不了解mysql的开发者,是出于什么样的需要,才实现了这种语法。 不过,从实际开发的过程中,基本上不需要用这种语法,实际也从来没有用到过
是吧,我用Oracle比较多,也不能这么用,真是惊叹MySQL的神奇。 所以问问精通MySQL的大家,这个语法是做什么用的,最好有精通MySQL源码的大咖聊聊一下parser这么做了之后ast执行时做了什么。[/quote] 说到这里,还有一个 mysql特有的语法: select * from xx group by id 这个语法也能运行。这个语句就很有用处[/quote] 好神奇的语法, 别卖关子,说说能用来做什么?

MariaDB [demo]> select * from t;
+----+------+------+
| id | val  | val2 |
+----+------+------+
|  1 |    1 | NULL |
|  2 |    2 | NULL |
|  3 |    3 | NULL |
|  4 |    4 | NULL |
|  5 |    5 | NULL |
|  6 |    1 |    1 |
|  7 |    2 |    2 |
|  8 |    3 |    3 |
|  9 |    4 |    4 |
| 10 |    5 |    5 |
+----+------+------+
10 rows in set (0.00 sec)

MariaDB [demo]> select * from t group by id;
+----+------+------+
| id | val  | val2 |
+----+------+------+
|  1 |    1 | NULL |
|  2 |    2 | NULL |
|  3 |    3 | NULL |
|  4 |    4 | NULL |
|  5 |    5 | NULL |
|  6 |    1 |    1 |
|  7 |    2 |    2 |
|  8 |    3 |    3 |
|  9 |    4 |    4 |
| 10 |    5 |    5 |
+----+------+------+
10 rows in set (0.00 sec)

MariaDB [demo]> select * from t group by val;
+----+------+------+
| id | val  | val2 |
+----+------+------+
|  1 |    1 | NULL |
|  2 |    2 | NULL |
|  3 |    3 | NULL |
|  4 |    4 | NULL |
|  5 |    5 | NULL |
+----+------+------+
5 rows in set (0.00 sec)

MariaDB [demo]> select * from t group by val2;
+----+------+------+
| id | val  | val2 |
+----+------+------+
|  1 |    1 | NULL |
|  6 |    1 |    1 |
|  7 |    2 |    2 |
|  8 |    3 |    3 |
|  9 |    4 |    4 |
| 10 |    5 |    5 |
+----+------+------+
6 rows in set (0.00 sec)

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧