美文网首页程序员公众号【麦小丁】征集优质文章
2018-12-23 MyBatis SQL无语法错误出现报错的

2018-12-23 MyBatis SQL无语法错误出现报错的

作者: 米开朗琪罗的翅膀 | 来源:发表于2018-12-24 15:26 被阅读7次

    问题描述:MyBatis动态SQl

    使用如下语句时,在最终的拼接中产生了 sql语法错误

    <if test="conditions!=null">

        <trim prefix="AND (" prefixOverrides="OR" suffix=")">

            <foreach item="item" index="index" collection="conditions" separator="or ">

                <if test="item!=null">

                    ${item}

                </if>

            </foreach>

        </trim>

    </if>

    错误截图:

    报错截图1

    同时产生错误的完整sql语句

    ==> Preparing: SELECT idaction_event_category AS eventCategory, idaction_event_action AS eventAction, idaction_name AS eventName, COUNT(*) AS nb_event, COUNT(DISTINCT idvisitor) AS nb_uniq_visitor, CONVERT(SUM(time_spent_ref_action)/count(*),DECIMAL) AS avg_spent_time FROM t_analytics_log_link_visit_action WHERE 1 = 1 AND idsite = ? AND idaction_event_category > 0 AND idaction_event_action > 0 AND ( (idaction_name=10478 and idaction_event_action=10476 and idaction_event_category=20962 )  or (idaction_name=20936 and idaction_event_action=10476 and idaction_event_category=20966 )  or (idaction_name=20936 and idaction_event_action=10476 and idaction_event_category=20967 )  or (idaction_name=20936 and idaction_event_action=10476 and idaction_event_category=20968 )  or (idaction_name=20936 and idaction_event_action=10476 and idaction_event_category=20969 )  or (idaction_name=20936 and idaction_event_action=10476 and idaction_event_category=20970 )  ) AND DATE(server_time) >= ? AND DATE(server_time) <= ? GROUP BY idaction_event_category, idaction_event_action, idaction_name

    以上的错误,是在解决问题后,根据问题原因再现出来的,产生问题的原因是:

    全角空格

    问题代码截图1

    注意红圈内的这个空格,这个空格是使用的全角空格,之所以会出现全角空格,因该语句为百度后从页面直接复制过来的,最终的sql语句中也出现了全角的空格,影响了MyBatis动态生成的最终sql

    问题代码截图2

    以上的空格出现在最终执行的sql语句中,使得sql解析出现问题,造成问题的原因并不是语法,而是插入了影响sql解析的全角空格。

    启示:sql语句虽然可以自动处理多余的空格,但是如果有全角空格,在sql中无法被正常解析,出现无语法错误仍然(提示语法错误)报错的现象。即sql语句无法处理全角空格

    避免:从他处上获取的代码段,极有可能潜藏这种全角空格的问题,而网页上的代码,存在一些不易发现的格式问题,会导致类似的报错,复制代码需要注意代码中符号的格式问题,另如果在xml编辑界面中使用了代码格式化就会自动纠正这个问题,经常性的代码格式化是一种可以避免代码格式问题出现的好习惯。

    相关文章

      网友评论

        本文标题:2018-12-23 MyBatis SQL无语法错误出现报错的

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