• varchar,char,varchar2,mybatis查询无返回


    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. 设计的时候尽量考虑  用空间换时间。

    nvarchar 和 varchar 的区别是存储方式不同 :
        varchar是按字节存储的,而带"n"的nvarchar是按字符存储的。比如说 varchar(40),能存储40个字节长度的字符,存储中文字符的时候,因为中文字符1个字符就等于2个字节.所以varchar(40)只能存储20个中文字符. 
    nvarchar(40),就可以存储40个中文字符,也就是说可以存储80个字节长度的字符.nvarchar要相对于存储的字符类型.比如有些字符是占3个字节的。同样的,char和nchar也一样道理。char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值。当你输入的字符大于指定的数时,它会截取超出的字符。varchar是变长型,它的存储空间会跟你输入的实际字符数而改变,但最大长度不能超过你指定的长度。 
        nvarchar是unicode的变长型,它和char的区别很明显了,它和varchar的区别主要是存储空间大,相同长度下能容内更多的字符。字符集是在安装 SQL Server 时选择的,不能更改。使用 Unicode 数据类型,列可存储由 Unicode 标准定义的任何字符,包含由不同字符集定义的所有字符。Unicode 数据类型需要相当于非 Unicode 数据类型两倍的存储空间。 

    以前在实际开发中遇到别人把比对状态设置成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

  • 相关阅读:
    面向对象编程思想-单例模式
    Bootstrap(四):CSS--表格
    Bootstrap(三):CSS--代码
    Git 学习第三天(一)
    Git 学习第四天
    Git 学习第二天(三)
    Git 学习第三天(二)
    Git 学习第二天(一)
    GIT 学习第二天 (二)
    Git 学习第一天
  • 原文地址:https://www.cnblogs.com/MyJavaStudy/p/11164425.html
Copyright © 2020-2023  润新知