问题描述: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编辑界面中使用了代码格式化就会自动纠正这个问题,经常性的代码格式化是一种可以避免代码格式问题出现的好习惯。
网友评论