首页 > 数据库 >JSQLParser碰到的问题

JSQLParser碰到的问题

时间:2023-06-19 11:06:02浏览次数:37  
标签:test1 碰到 test2 -- 中文 问题 JSQLParser SQL id


JSQLParser是github上一个开源的项目,专门解析SQL,可以轻松地得到一条SQL的列、表、条件等对象,

JSQLParser碰到的问题_java

P.S. https://github.com/JSQLParser/JSqlParser

最近在做一个功能开发的时候,被他困扰了下,从需求来讲,就是利用正则,先将多行的SQL改成一行,然后通过JSQLParser解析SQL,但是在这过程中,碰到了很多问题。

问题1,提示EOF

最崩溃的,就是这个错误,

Encountered unexpected token: EOF

EOF我们在C中经常看到的,表示文件结尾,End Of File,但在这提示,一开始确实迷惑,忽略中间各种盲测调试,其实问题就出在所有的SQL合并到单行,如果存在"--"这种语法就会导致"--"跟着的所有内容,都是注释,如果之前的内容恰巧不能构成一条正确的SQL,就会提示未找到正确的结尾。

场景1,字段中出现"--内容",

select c1, --测试字段
       c2, c3
  from test1
  join test2
 where test1.id = test2.id;

场景2,字段中出现"--无内容",

select c1, --
       c2, c3
  from test1
  join test2
 where test1.id = test2.id;

场景3,WHERE条件中出现"--内容",

select c1, --测试字段
       c2, c3
  from test1
  join test2
 where test1.id = test2.id --连接
   and test1.id = 1;

以上三个场景,如果要将SQL整合成为一行,就需要替换这些"--",

replaceAll("--.+[^.+]", " ")
.replaceAll("--[^.+]", " ")
.replaceAll("[\r\n]", " ");

问题2,提示"\\"

Encountered: "\\" after : ""

通过SQL,

select c1, --测试字段
       c2,
       REPLACE(REPLACE(to_char(SUBSTR(regexp_REPLACE(c3, '\s',''),1,25)),'\','\\'),'"','\"') AS c3
  from test1
  join test2
 where test1.id = test2.id;

定位到是REPLACE函数中用到的"\\",

regexp_REPLACE(TEST, '\s',''),1,25)),'\','\\')

因此再增加对"\\"的函数替换,将其改为统一的"XXX",

.replaceAll("\\\\", "XXX")

问题3,提示\uff01

Encountered: "\uff01" (65281), after : ""

\uff01这个其实是中文的叹号,

>>> print(u'\uff01')
!(中文叹号)

除了这种中文叹号的使用,还出现了中文的括号,"("和")",如下所示,

场景1 中文叹号,

select c1, --测试字段
       c2, c3
  from test1
  join test2
 where test1.id = test2.id and test1.output !(此处是中文叹号)= 1;

场景2,中文括号,

select c1, --测试字段
       c2, c3
  from test1
  join test2
 where test1.id = test2.id 
   and test1.output in ((此处是中文括号)1, 2, 3)(此处是中文括号);

我们知道,SQL中使用中文符号,执行报错,如下所示,

SQL> select * from test where owner !='a';
select * from test where owner !='a'
                               *
ERROR at line 1:
ORA-00911: invalid character

但是既然出现了,程序上就得规避,hard code对这些字符,进行替换,

.replaceAll("!", "!")      // 替换中文的!
.replaceAll("(", "(")      // 替换中文的(
.replaceAll(")", ")");     // 替换中文的)

从这个处理过程我们能看到,SQL的标准写法上,其实还是有很多值得遵循的,所谓无规矩,不成方圆,还是有他的道理。


标签:test1,碰到,test2,--,中文,问题,JSQLParser,SQL,id
From: https://blog.51cto.com/u_13950417/6511643

相关文章

  • Windows调试Oracle数据库问题的一些手段
    最近需要在Windows的跳板机上访问远程的Oracle数据库进行调试。Windows中只有个精简版OracleClient,以及PLSQLDeveloper客户端。如果用惯了Linux,再用Windows,确实不知所措。但这就是个从生疏到熟练的事儿,最近看的一本书中描述得很恰当,Themosteffectivewaytodealwithaworry......
  • 一个困扰许久的Word嵌入文档问题(求助)
    最近碰到个Word问题,研究了很久,一直没能解决,看各位读者朋友,能不能提供一些更好的解决方案。软件信息:MicrosoftWord2016(正式版)(1)操作将某个word或者excel文档,直接拖拽到另外一个Word正文中,或者点击Word的"插入"->"对象",选择本地文件,上传到Word正文中,(2)现象不关闭当前Word,直接双击嵌入......
  • 关于前后端JSON解析差异问题与思考
    本文主要总结了作者在一次涉及流程表单的需求发布中遇到的问题及思考总结。 一、问题回顾在一次涉及流程表单的需求发布时,由于表单设计的改动,需要在历史工单中的一个json字段增加一个属性,效果示意如下:[{"key1":"value1"}]->[{"key1":"value1","key2":"value2"}]......
  • 关于前后端JSON解析差异问题与思考
    本文主要总结了作者在一次涉及流程表单的需求发布中遇到的问题及思考总结。 一、问题回顾在一次涉及流程表单的需求发布时,由于表单设计的改动,需要在历史工单中的一个json字段增加一个属性,效果示意如下:[{"key1":"value1"}]->[{"key1":"value1","key2":"value2"}]......
  • MAVEN 相关问题
    MAVEN相关问题MAVEN安装检查JDK是否安装1、C:\Users\panjunbiao>echo%Java_Home%C:\Users\panjunbiao>java-version2、安装连接https://help.aliyun.com/document_detail/40814.html下载maven1、maven下载界面https://link.csdn.net/?target=http%3A%2F%2Fmav......
  • maltego的 卡 慢 没反应 的问题解决方法
    maltego的卡慢没反应的问题主要是因为它要在国外下载和认证一些东西,导致软件无法正常访问。解决方法:配置带理,软件内部就支持,打开选择设置,    选择手动指定,填入服务器ip和端口,我使用链接本地服务器带理,服务器要允许局域网连接,并且关闭服务器上的防火墙,如果......
  • 关于python反射机制中的参数问题处理
    关于python反射机制中的参数问题处理 python的反射机制十分的常用,主要是字符串与模块应用之间的连接方法。核心是将字符串转换成可以调用模块、模块方法的变量。主要包括了以下四个方法:hasattr(obj,name,/)Returnwhethertheobjecthasanattributewi......
  • 虚拟机安装ubuntu22.04以及后续出现的问题
    官网下载:Ubuntu系统下载|Ubuntu创建新的虚拟机 自定义 默认下一步 修改安装位置,系统盘会不断增加 默认下一步 自定义硬件(移除打印机),使用ISO映像文件(M)  关闭,完成。开启虚拟机:(默认启动默认安装,要不容易卡死) 安装Ubuntu continue创建SWAP分区:S......
  • 本科生应该选择考研还是就业?这是所有大学生应该思考的问题
    亮观点首先要声明接下来的内容主要是针对互联网人来说的,不适用于所有人。对于互联网人,特别是做技术的来说,越早就业越好。是什么给出这个结论?我在大一的时候就决定了毕业以后找工作,读到高三已经是12年的光阴,对于当时的我来说,再读完四年大学,我再也不想读书了。一是因为家庭条件......
  • 机器学习中的神经网络:如何创建强大的模型并解决复杂的问题
    目录文章标题:《17."机器学习中的神经网络:如何创建强大的模型并解决复杂的问题"》文章背景介绍:随着人工智能技术的快速发展,神经网络已经成为机器学习领域中最受欢迎的模型之一。神经网络是一种基于深度学习的技术,能够通过多层神经元来学习和提取特征,从而实现复杂的分类、回归和......