1. char类型的长度是固定的,varchar的长度是可变的。
这就表示,存储字符串'abc',使用char(10),表示存储的字符将占10个字节(包括7个空字符)
使用varchar2(10),,则表示只占3个字节,10是最大值,当存储的字符小于10时,按照实际的长度存储。
2.char类型的效率比varchar的效率稍高
3.varchar 与 varchar2的区别
varchar2是oracle开发的一个数据类型。
工业标准的varchar可以存储空字符串,oracle的varchar2还可以存储NULL值,如果想要有向后兼容的能力建议使用varchar2
4.varchar2比char节省空间,但是在效率上比char稍差些。既要获得效率即必须牺牲一点空间,这就是设计上的"以空间换时间"
varchar2虽然比char节省空间,但是一个varchar2列经常被修改,而且每次修改的数据长度不同,这会引起“行迁移的现象”,
而这造成的多余的I/O,是数据库设计中尽量避免的,在这种情况下使用char代替varchar2会更好些。
总结:1. 如果一个字段经常被修改,而且每次修改的数据长度不同,为了效率应当考虑用char定长代替varchar2变长。(列如一个用户的名字经常被修改)
2. 设计的时候尽量考虑 用空间换时间。
以前在实际开发中遇到别人把比对状态设置成char(3) 在navicate能查到响应的结果 但是在mybatis中却不能 解决方法、
1 将长度改为1 可能会报错 因为长度变小了
2 trim()函数去空格:
二、深入了解mybatis返回null
抛开mybatis框架,回到原始的jdbc查询,当使用oracle的char类型作为条件查询数据时,只有值完全一样时才能查到数据。
如创建一个测试表:
create table t_user( user_name char(5) ); insert into t_user (user_name)values('sgl');
select '"'||user_name||'"' from t_user
; -- 查询结果为"sgl ",可以看出oracle自动补了两个空格
通过jdbc的PreparedStatement方式查询数据:
conn=getConnection(); ps=conn.prepareStatement("select * from t_user where user_name=?"); ps.setString(1,"sgl"); ResultSet rs = ps.executeQuery();
通过上面方式是无法查到数据的,因为查询条件值”sgl”和数据库中值”sgl “是不相等的。
如果值用“sgl ”可以查到数据
conn=getConnection(); ps=conn.prepareStatement("select * from t_user where user_name=?"); ps.setString(1,"sgl "); -- 增加两个空格不足5位长度 ResultSet rs = ps.executeQuery();
如果使用trim()方式也可以查询到数据,如:
ps=conn.prepareStatement("select * from t_user where trim(user_name)=?"); -- 先对数据库中user_name进行去空格,然后再比较 ps.setString(1,"sgl"); ResultSet rs = ps.executeQuery();
参考博客:https://www.cnblogs.com/xianlei/p/8691643.html