mybatis的char与varchar的区别

简介: mybatis的char与varchar的区别

1.场景描述:


<if test="startDate != null and startDate !=''">
                    <![CDATA[
                        AND t.effective_date>= #{startDate,jdbcType=VARCHAR}
                     ]]>
 </if>
 <if test="endDate != null and endDate !=''">
                    <![CDATA[
                        AND t.effective_date <= #{endDate,jdbcType=VARCHAR}
                     ]]>
</if>


根据时间区间查询数据时,当开始时间和结束时间相同时,查询不到数据;当开始时间和结束不同时,却可以查到结果;


此时用的是占位符#,而当使用连接符$时,问题不复现;


2.问题原因:



1.数据库中对应的时间字段属性为char(10),而存储格式为YYYYmmdd,对于oracle数据库的char类型,当长度不足时,会在后位用空格补齐;


2.使用连接符$时,相当于CHAR型与字符常量的比较,字符常量作为char型处理,也就是在比较时会自动将常量右补齐空格后比较;所以可以正常查到结果;


3.使用占位符#时,相当于当CHAR类型和VARCHAR2类型比较,比较时对字段值是不作处理,直接比较的,所以查不到结果;而当开始时间和结束时间不同时,主要比较的是非空格部分,所以可以查到结果;


第一种解决方案: 加trim; 如下:

where MUID = #{muid,jdbcType=CHAR}
  and trim(LOCALNAME) = #{localname,jdbcType=CHAR}


第二种解决方案: 将#替换为$ ;如下:

where MUID = #{muid,jdbcType=CHAR}
  and LOCALNAME = ${localname}
由于使用$符,存在sql注入的隐患,所以不推荐使用;


第三种解决方案: 将数据库中字段的属性改为与内容长度一致,或是直接只用varchar属性;

比如: date char(8)  --> YYYYmmdd


3.参考文档:



1.oracle中char与varchar2的区别 http://blog.csdn.net/haiross/article/details/44150809#t0


2.mybatis使用oracle char 字段查询返回结果总是null  http://blog.csdn.net/xiaxiaorui2003/article/details/52302080

相关文章
|
17天前
|
SQL 安全 Java
MyBatis(6)#{}和${}的区别
在MyBatis中,`#{}`和`${}`是用于在SQL语句中嵌入参数的两种方式。`#{}`用于预处理参数,可以防止SQL注入;而`${}`进行直接字符串替换,适用于动态插入表名或列名,但存在SQL注入风险。建议优先使用`#{}`,并在必要时谨慎使用`${}`。
|
2月前
|
SQL XML Java
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
文章介绍了MyBatis的简单增删改查操作,包括创建数据表、实体类、配置文件、Mapper接口及其XML文件,并解释了`#{}`预编译参数和`@Param`注解的使用。同时,还涵盖了resultType与resultMap的区别,并提供了完整的代码实例和测试用例。
mybatis复习02,简单的增删改查,@Param注解多个参数,resultType与resultMap的区别,#{}预编译参数
|
3月前
|
存储 数据管理 数据库
|
3月前
|
SQL Java 数据库连接
MyBatis 和 Hibernate 有什么区别?
【8月更文挑战第21天】
65 0
|
3月前
|
SQL Java 数据库连接
在mybatis中#{}和${}的区别
在MyBatis中,使用#{}可以防止SQL注入,它通过预处理语句来安全地设置参数值,而${}会将传入的数据直接插入SQL语句中,不安全,通常用于传入数据库对象或在确保数据安全的情况下使用。
|
5月前
|
SQL XML Java
蓝易云 - ibatis与mybatis的区别
总的来说,MyBatis在功能性和易用性上都优于iBatis,是iBatis的改进版。
41 2
|
6月前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
5月前
|
SQL Java 数据库连接
【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
【MyBatis】MyBatis操作数据库(二):动态SQL、#{}与${}的区别
62 0
|
6月前
|
SQL 缓存 Java
|
6月前
|
存储
char *str,char &str,char *& str和char str的区别
char *str,char &str,char *& str和char str的区别
103 0