IT Notes‎ > ‎Database‎ > ‎Oracle‎ > ‎

空格导致不能删除记录的问题

运行环境

Oracle 9i, Oracle JDBC driver ojdbc14.jar
 

本文发现

如果用固定长度字段, 在用PreparedStatement.setString(int, String)设值的时候, 需要用空格在右边补位, 否则判为不等. 直接用字符串拼接sql不存在这个问题.

案例

假设有表
hello001(id, fix_id), id: nvarchar(20), fix_id: char(10)

并且已经插入一条记录
insert into allcomments.hello001(id, fix_id) values ('nihao', 'nihao')

通过JDBC删除这条记录, 有两种方式: 一是用PreparedStatement, 二是用Statement

PreparedStatement 方式:
        Connection conn = DatabaseConn.getConnection();
        String sql = "delete from hello001 where fix_id = ?";
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(sql);
//          ps.setString(1, "nihao     ");//这样才能能删除记录, 需要用空格补足位数
            ps.setString(1, "nihao");//这样是不可以的
            ps.executeUpdate();
        } catch (SQLException e) {
           ...
        } finally {
           ...
        }
        
Statement  方式:
        Connection conn = DatabaseConn.getConnection();
        String sql = "delete from hello001 where comment_id = 'nihao'";
        Statement stmt = null;
        try {
            stmt = conn.createStatement();
            stmt.executeUpdate(sql);
        } catch (SQLException e) {
          ...
        } finally {
          ...
        }
    }
            

如果用Statement, 因为是拼字串, 和上面的拼字串方式一样, 可以删除记录.

但直接通过PL/SQL Developer执行
delete from hello001 where fix_id='nihao '

delete from hello001 where fix_id='nihao'
效果一样, 右侧空格智能处理.



TODO:
有关数据右侧有空格的问题, 还需要关注插入的情况.
分: 数据右侧有空格, 数据格式是定长和可变长度.
写了一个工具类, 字串变长, 但是否适用于mysql, 有待验证.
Comments