由于历史项目原因,有个表中的字段名称为IDENTITY,同样也是db2关键字,这样我们在分析语句: SELECT ID,IDENTITY,BUSICODE FROM BUSINESS_ENTERPRISE_BUSIINFO WHERE SYSCODE= '603' ORDER BY INTIME desc FETCH first 1 rows only
时出错,分析到IDENTITY时认为是关键字,便无法解析了,但是该语句在db2中的执行时没有问题的,db2会分析上下文环境来判断该字段是不是关键字。 目前我们临时添加了引号来避免该问题,如下: SELECT ID, “IDENTITY”, BUSICODE FROM BUSINESS_ENTERPRISE_BUSIINFO 也在新开发项目中避免使用关键字作为表字段。
在select item的分析中,仅仅通过匹配关键字的方式就认为是关键字好像不太合理。
原提问者GitHub用户leezongjie
DB2数据库中,IDENTITY是一个关键字,用于指定一个自增长列。如果在SELECT语句中包含了一个名称为IDENTITY的列,就会导致解析错误。
为了解决这个问题,可以使用双引号将包含IDENTITY关键字的列名括起来,例如:
Copy
SELECT "IDENTITY", column1, column2 FROM table1;
在这个SQL语句中,使用双引号将包含IDENTITY关键字的列名括起来,从而避免了解析错误。
另外,为了避免这种问题,建议在设计数据库时避免使用保留字或关键字作为列名,这样可以避免在后续的SQL语句中出现解析错误的情况。
你提到的问题确实存在,由于部分数据库关键字也可以作为表字段名,因此在解析SQL时会导致解析器错误地将包含关键字的字段名识别为关键字。
在DB2中,可以通过在字段名周围使用引号来避免将其识别为关键字。像你提到的那样,将字段名IDENTITY用引号括起来可以正确识别并解析。
关于解析器仅仅通过匹配关键字来判断是否为关键字的问题,具体的解析器设计可能因供应商而异。这种设计可能是为了在解析过程中保持简单和高效。然而,正如你所指出的,这种设计并不完善,因为可以通过更多的上下文信息来判断字段名是否是关键字。
对于使用关键字作为表字段名的情况,最佳做法是将字段名用引号括起来,以避免解析器误识别。同时,尽量避免在新开发项目中使用关键字作为字段名,以避免产生类似的问题。
如果你认为解析器的行为不够合理,可以向DB2的开发团队反馈该问题,并提出改进建议。这样可以帮助他们改善解析器的准确性和健壮性。
问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14
原回答者GitHub用户wenshao
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。