当前位置:  数据库>oracle

简单对比MySQL和Oracle中的一个sql解析细节

    来源: 互联网  发布时间:2017-06-16

    本文导语: SQL的语法解析器是一个很强大的内置工具集,里面会涉及到很多的编译原理的相关知识,语法分析,词法分析。。一大堆看起来很理论的东东,不过看起来枯燥之余,它们的价值也更加明显。 借用一下网络中的原话:如果我们...

SQL的语法解析器是一个很强大的内置工具集,里面会涉及到很多的编译原理的相关知识,语法分析,词法分析。。一大堆看起来很理论的东东,不过看起来枯燥之余,它们的价值也更加明显。
 借用一下网络中的原话:如果我们考究一下历史,就会发现很多被称为程序设计大师的人都是编译领域的高手.写出第一个微型机上运行的Basic语言的比尔盖茨,设计出Delphi的Borland的”世界上最厉害的程序员”, Sun的JAVA之父, 贝尔实验室的C++之父
 起点提得有些高了,今天和大家分享的案例是一个很简单的sql语句,在MySQL中能够解析出问题,但在Oracle中就可以成功解析,通过这一个细节也能够看出一些Oracle和MySQL中的一些差别。
 需要运行的语句如下:
SELECT THREAD_ID, threads.NAME, SUM (COUNT_STAR) AS Totalcount, SUM(SUM_TIMER_WAIT) AS Totaltime
 FROM performance_schema.events_waits_summary_by_thread_by_event_name
 INNER JOIN performance_schema.threads USING (THREAD_ID)
 WHERE threads.NAME LIKE 'thread/sql/slave-%'
 GROUP BY THREAD_ID, threads.NAME;
ERROR 1630 (42000): FUNCTION performance.sum does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
乍一看这个错误,感觉一定是哪里出了问题,自己找了一会没发现明显的语句问题,但是从错误来看问题似乎发生在sum字眼的附近。
 简单把第1行中的
SUM (COUNT_STAR) AS Totalcount 改为SUM(COUNT_STAR) AS Totalcount 问题就引刃而解了。可以看出问题是一个很细小的问题,严格来说,确实是语句写得不够严谨。但在我的印象中Oracle似乎对这钟情况也是手到擒来,印象中没有出现过此类问题。
 我们来简单在MySQL和Oracle中模拟一下这个问题,看看结果如何。
在MySQL中
create table parse_test ( id int, name varchar(30));
 insert into parse_test values(1,'aa');
 insert into parse_test values(2,'bb');
 commit;

 mysql> select count(id) from parse_test;
 +-----------+
 | count(id) |
 +-----------+
 |        2 |
 +-----------+
 1 row in set (0.00 sec)

 mysql> select count (id) from parse_test;
ERROR 1630 (42000): FUNCTION test.count does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual

在Oracle中就没有任何问题了。
create table parse_test( id number, name varchar2(30));
 insert into parse_test values(1,'aa');
 insert into parse_test values(2,'bb');
 commit;
 select count(id)from parse_test;
  COUNT(ID)
 ----------
          2
 select count (id) from parse_test;
  COUNT(ID)
 ----------
          2


抛开Oracle解析复杂sql语句的优势,可以看出Oracle在这种细节方面确实支持的力度要高一些。
 不过最开始在MySQL出错的语句在放到Oracle里面(如果假设表结构数据都存在),也一定运行不了。原因就在于Oracle中定义的表明长度最大是30位,但是在MySQL中支持的要多不少,达64位。

mysql> create table events_waits_summary_by_thread_by_event_name567890123456789012345 ( id int, name varchar(30));
ERROR 1059 (42000): Identifier name 'events_waits_summary_by_thread_by_event_name567890123456789012345' is too long
 mysql> select length('events_waits_summary_by_thread_by_event_name567890123456789012345');
 +-----------------------------------------------------------------------------+
 | length('events_waits_summary_by_thread_by_event_name567890123456789012345') |
 +-----------------------------------------------------------------------------+
 |                                                                          65 |
 +-----------------------------------------------------------------------------+
 1 row in set (0.01 sec)

当然了我也是到此为止我也是捡个小石头,弄点儿水花,对于sql解析器更深入的问题,如果细究,从MySQL代码层面能够分析出问题来就一个基本目标了。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Docker监控以及cAdvisor和Prometheus监控工具的对比
  • Oracle数据库对比工具 DBT
  • JS逐像素对比图片 IM.js
  • 在linux GNOME 下怎么调整显示器的 颜色 和对比度 ?
  • 搜索指定格式的文件,并将这些文件对比
  • JSP和ASP的对比资料,谁有啊?
  • shell对比文件内容脚本分享
  • Linux不同版本内核目录下的ChangeLog是以哪个版本作为对比?
  • jQuery 滑动对比插件 twentytwenty
  • 与MSSQL对比学习MYSQL的心得(三)--查看字段的长度
  • v4l2亮度 饱和度 对比度在videodev2.h中对应那个结构体啊?
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(八)
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(三)
  • stdio对比unistd仅仅是多了一层缓存么?
  • 请问在Unix/Linux上的套接字模型有那些,那些比较常用,Apache使用的是那个,谢谢?!如果能和Windows上的作对比就更好了
  • SQL中Charindex和Oracle中对应的函数Instr对比
  • 与MSSQL对比学习MYSQL的心得(四)--BLOB数据类型
  • Oracle不同数据库间对比分析脚本
  • mssql server 2012(SQL2012)各版本功能对比
  • 各系统之间的安全性对比
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(七)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3