美文网首页
sql系统关键字转义

sql系统关键字转义

作者: 站在海边看远方 | 来源:发表于2019-10-28 15:49 被阅读0次

    经评论区朋友的指点,此篇文章存在问题,不把SQL关键字作为字段名才是解决问题的关键。
    单独针对mysql,可以使用反引号,即`
    对于oracle,需要使用双引号加大写,即"KEY"这种,或者直接不加任何符号,不能使用单引号,不然会出现评论区兄弟说的那种情况,即查询结果的字段是返回'key'这种形式。
    sql使用单引号

    select id, 'key ','value',refuse_value,start_time,end_time,expire_seconds from APIGW_THROTTLING_STATINFO ;
    

    查询见截图,下面返回的查询结果中返回的字段名带有单引号:


    k-v.png

    查询结果中应该不带单引号的。
    所以为了兼顾mysql和oralce,最好的办法是修改字段名,不要涉及sql系统关键字和特殊字段。

    下面为原文,未做修改

    在mybatis的xml配置中有如下sql语句:

    <select id="qryInfo" parameterType="xxx.ApiCategoryDto" resultType="xxx.ThrottlingStatInfoDto" flushCache="true">
        select id, key,value,refuse_value,start_time,end_time,expire_seconds from APIGW_THROTTLING_STATINFO where expire_seconds > #{expireSeconds}
    </select>
    

    上述配置,在mysql中会报错

    java.sql.SQLSyntaxErrorException: (conn=167) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'key,value,refuse_value,start_time,end_time,expire_seconds from APIGW_THROTTLING_' at line 1
    

    提示有语法错误, key value为msyql系统关键字,解决方法可以是可以用反引号,如下

    `key`,`value`
    

    这样做在mysql中是可以的,不过在oracle中使用反引号会报错
    上述mybatis配置中的sql在oracle中执行是没问题的,
    所以为了sql在mysql和oracle中都能执行,使用单引号更改sql语句,改完如下:

    <select id="qryInfo" parameterType="xxx.ApiCategoryDto" resultType="xxx.ThrottlingStatInfoDto" flushCache="true">
        select id, 'key','value',refuse_value,start_time,end_time,expire_seconds from APIGW_THROTTLING_STATINFO where expire_seconds > #{expireSeconds}
    </select>
    

    这样在mysql和oracle中都可以执行了。

    相关文章

      网友评论

          本文标题:sql系统关键字转义

          本文链接:https://www.haomeiwen.com/subject/lsebvctx.html