CREATE TABLE "item_extra" ( "id" int(10) unsigned NOT NULL AUTO_INCREMENT, "item_id" int(10) unsigned NOT NULL DEFAULT '0' COMMENT '商品id', "type" tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '扩展属性类型,0:虚拟商品', "attr_key" varchar(50) NOT NULL COMMENT '扩展属性key', "attr_value" varchar(500) NOT NULL COMMENT '扩展属性value', PRIMARY KEY ("id"), KEY "idx_item_type_kv" ("item_id","type","attr_key","attr_value"(191)) )
使用 1.0.21 parser 会发生如下错误?
com.alibaba.druid.sql.parser.ParserException: not support token:LITERAL_INT at com.alibaba.druid.sql.parser.SQLExprParser.methodRest(SQLExprParser.java:799) ~[druid-1.0.21.jar:1.0.21] at com.alibaba.druid.sql.parser.SQLExprParser.primaryRest(SQLExprParser.java:751) ~[druid-1.0.21.jar:1.0.21] at com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser.primaryRest(MySqlExprParser.java:481) ~[druid-1.0.21.jar:1.0.21] at com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser.primary(MySqlExprParser.java:132) ~[druid-1.0.21.jar:1.0.21] at com.alibaba.druid.sql.parser.SQLExprParser.expr(SQLExprParser.java:124) ~[druid-1.0.21.jar:1.0.21] at com.alibaba.druid.sql.dialect.mysql.parser.MySqlCreateTableParser.parseConstraint(MySqlCreateTableParser.java:787) ~[druid-1.0.21.jar:1.0.21] at com.alibaba.druid.sql.dialect.mysql.parser.MySqlCreateTableParser.parseCrateTable(MySqlCreateTableParser.java:157) ~[druid-1.0.21.jar:1.0.21] at com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser.parseCreate(MySqlStatementParser.java:340) ~[druid-1.0.21.jar:1.0.21] at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatementList(SQLStatementParser.java:190) ~[druid-1.0.21.jar:1.0.21] at com.alibaba.druid.sql.parser.SQLStatementParser.parseStatement(SQLStatementParser.java:1974) ~[druid-1.0.21.jar:1.0.21]
原提问者GitHub用户ChinaXing
在使用阿里云的Druid SQL Parser解析SQL语句时,有时会出现特殊的索引格式导致解析失败的情况。这通常是因为Druid SQL Parser不支持这种特殊的索引格式。
为了解决这个问题,可以尝试以下几种方法:
修改SQL语句,将特殊的索引格式改为标准的索引格式。例如,将索引名用反引号括起来,以避免Druid SQL Parser无法解析。
升级Druid SQL Parser的版本,以确保支持更多的索引格式。
使用其他的SQL解析器,例如JSqlParser、ANTLR等。
如果无法修改SQL语句或者更换SQL解析器,可以考虑手动解析SQL语句,以避免Druid SQL Parser解析失败。手动解析SQL语句需要一定的SQL语法知识和编程能力,需要仔细分析SQL语句的结构,并使用正则表达式或字符串操作等方法来提取需要的信息。
根据错误信息,看起来是Druid的SQL解析器在解析索引时遇到了问题。具体来说,Druid的1.0.21版本中的解析器似乎不支持索引中指定列的长度。
在你提供的CREATE TABLE语句中,索引"idx_item_type_kv"的定义中包含了"(191)"这样的列长度指定。然而,Druid的解析器可能无法正确解析这个列长度,从而导致解析失败。
解决这个问题的一种方法可能是升级Druid版本到一个更新的版本,或者尝试使用其他第三方的SQL解析工具。这些工具可能具有更好的兼容性和更全面的SQL语法支持,从而能够正确解析索引的定义。
另外,如果你对Druid的解析器存在问题感到担忧,你可以向Druid的开发团队或社区报告此问题,以帮助他们修复和改进解析器的功能。他们可能会提供更详细和准确的解决方案,或者采取其他措施来处理这个问题。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。