当设置set sql_mode = 'ANSI'. 时, show create table 返回的语句中,列和表名会用双引号包含。这是ANSI 标准SQL模式。
如下,而这种语句Druid的parser 会报错。无法解析。
CREATE TABLE "MessageInstance" ( "id" int(11) NOT NULL AUTO_INCREMENT, "clusterId" int(11) NOT NULL, "messageId" int(11) NOT NULL, "ipv4" varchar(10) DEFAULT NULL, "masterIpv4" varchar(10) DEFAULT NULL, "port" int(4) DEFAULT NULL, "managerPort" int(4) DEFAULT NULL, "online" tinyint(4) DEFAULT NULL, "status" tinyint(4) DEFAULT NULL, "info" varchar(100) DEFAULT NULL, "role" tinyint(4) DEFAULT NULL, "created" datetime DEFAULT NULL, "updated" datetime DEFAULT NULL, PRIMARY KEY ("id"), KEY "ix_messageId" ("messageId") )
错误:
com.alibaba.druid.sql.parser.ParserException: syntax error, error in :' KEY "ix_messageId" ("messageId") )',expect LPAREN, actual LITERAL_ALIAS ix_messageId
能否给予支持解析?
原提问者GitHub用户ChinaXing
当MySQL的sql_mode设置为ANSI格式时,可能会导致无法解析CREATE TABLE语句。这是因为ANSI模式下,MySQL的SQL解析器会按照ANSI SQL标准进行解析,而不是按照MySQL特有的语法规则进行解析,从而导致解析错误。
这个问题是由于Druid的解析器不支持双引号包含的列和表名引起的。在ANSI SQL模式下,双引号是用来转义标识符的,以允许使用特殊字符或关键字作为列和表名。然而,Druid的解析器可能只支持使用反引号(`)来转义标识符。
要解决这个问题,您可以尝试以下方法之一:
CREATE TABLE MessageInstance
( id
int(11) NOT NULL AUTO_INCREMENT, clusterId
int(11) NOT NULL, messageId
int(11) NOT NULL, ipv4
varchar(10) DEFAULT NULL, masterIpv4
varchar(10) DEFAULT NULL, port
int(4) DEFAULT NULL, managerPort
int(4) DEFAULT NULL, online
tinyint(4) DEFAULT NULL, status
tinyint(4) DEFAULT NULL, info
varchar(100) DEFAULT NULL, role
tinyint(4) DEFAULT NULL, created
datetime DEFAULT NULL, updated
datetime DEFAULT NULL, PRIMARY KEY (id
), KEY ix_messageId
(messageId
) )
请注意,虽然使用双引号包含列和表名在ANSI SQL模式下是有效的,但这种用法在其他数据库中可能不被支持,并且可能会导致移植性问题。因此,在编写创建表语句时,最好避免使用特殊字符和关键字作为列和表名,或者在必要时使用反引号进行转义。
希望这些信息对您有帮助。如果您还有其他问题,请随时提问。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。