分享:解决 jsqlparser不支持中文的问题

解决 jsqlparser不支持中文的问题

今天下载了 jsqlparser,打算用在简表中,不曾想不持中文,运行以下代码,出现如下错误:
复制内容到剪贴板
代码:
public static void main(String[] args) {
try {
Statement stat = new CCJSqlParserManager().parse(new StringReader("select 年份,月份,sum(金额) from 订单查询 group by 年份,月份 order by 年份,月份"));
System.out.println();

} catch (JSQLParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
Caused by:
net.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 1, column 9. Encountered: "\u5e74" (24180), after : ""
at net.sf.jsqlparser.parser.CCJSqlParserTokenManager.getNextToken(CCJSqlParserTokenManager.java:1328)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_scan_token(CCJSqlParser.java:5244)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_140(CCJSqlParser.java:4531)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_107(CCJSqlParser.java:4568)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_65(CCJSqlParser.java:4045)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3R_35(CCJSqlParser.java:4145)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_3_5(CCJSqlParser.java:4591)
at net.sf.jsqlparser.parser.CCJSqlParser.jj_2_5(CCJSqlParser.java:3059)
at net.sf.jsqlparser.parser.CCJSqlParser.SelectBody(CCJSqlParser.java:562)
at net.sf.jsqlparser.parser.CCJSqlParser.Select(CCJSqlParser.java:554)
at net.sf.jsqlparser.parser.CCJSqlParser.Statement(CCJSqlParser.java:110)
at net.sf.jsqlparser.parser.CCJSqlParserManager.parse(CCJSqlParserManager.java:38)
at jatools.designer.data.DatasetPreviewer.main(DatasetPreviewer.java:231)

网上查了一圈,不得要领,后来查看JSqlParserCC.jj文件,发现id只支持以a-z,A-Z字符开始的串,为此,加上相应的unicode字符即可以了,以下粗体部分是加上去的部分,这样重新javacc一下,就可以了
如下所示


TOKEN:
{
< S_IDENTIFIER: ( <LETTER> )+ ( <DIGIT> | <LETTER> |<SPECIAL_CHARS>)* >
| < #LETTER:
["a"-"z",
"A"-"Z",
"\u0024",
"\u0041"-"\u005a",
"\u005f",
"\u0061"-"\u007a",
"\u00c0"-"\u00d6",
"\u00d8"-"\u00f6",
"\u00f8"-"\u00ff",
"\u0100"-"\u1fff",
"\u3040"-"\u318f",
"\u3300"-"\u337f",
"\u3400"-"\u3d2d",
"\u4e00"-"\u9fff",
"\uf900"-"\ufaff"] >
编辑 引用 使用道具 评分 回复 删除 屏蔽帖子 TOP
IP admin

管理员

发短消息加为好友当前离线
2#大中小 发表于 2010-12-9 17:02 只看该作者
这个是经过楼上方法,处理过的 jsqlparser-0.6.2。欢迎下载!

http://bbs.jatools.com/attachment.php?aid=348&k=6587ec5e3d3f29c8644aa37370a19f04&t=1373962914
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个完整的 Java 程序,可以使用 JSqlParser 提取 SQL 语句中的所有函数: ```java import net.sf.jsqlparser.expression.ExpressionVisitorAdapter; import net.sf.jsqlparser.expression.Function; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.util.TablesNamesFinder; import java.util.List; public class ExtractFunctions { public static void main(String[] args) { String sql = "SELECT COUNT(*) FROM orders WHERE YEAR(order_date) = 2021 AND MONTH(order_date) = 7"; try { Statement statement = CCJSqlParserUtil.parse(sql); // 提取所有函数 FunctionVisitor visitor = new FunctionVisitor(); statement.accept(visitor); // 提取所有表名 TablesNamesFinder tablesNamesFinder = new TablesNamesFinder(); List<String> tableList = tablesNamesFinder.getTableList(statement); // 输出结果 System.out.println("Functions:"); for (String function : visitor.getFunctions()) { System.out.println("- " + function); } System.out.println("Tables:"); for (String table : tableList) { System.out.println("- " + table); } } catch (Exception e) { e.printStackTrace(); } } static class FunctionVisitor extends ExpressionVisitorAdapter { private final StringBuilder sb = new StringBuilder(); @Override public void visit(Function function) { sb.append(function.getName().toLowerCase()).append("("); if (function.getParameters() != null) { function.getParameters().accept(this); } sb.append(")"); } public List<String> getFunctions() { return List.of(sb.toString().split(",")); } } } ``` 该程序会输出 SQL 语句中的所有函数名以及表名。需要注意的是,该程序使用了 Java 11 的 List.of 方法,如果使用的是低版本的 Java,需要将该方法替换为其他方式来创建 List 对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值