I puzzled by the following:

The query SELECT * FROM t WHERE v like ''

appears to give me all rows where v is an empty
string, as expected.

But a prepared statement

SELECT * FROM t WHERE v like ?, with setString(1, "")

always gives zero rows. Is this expected?

Detailed example:
        conn.setAutoCommit(true);

        Statement s = conn.createStatement();
        try { s.execute("drop table t"); } catch (SQLException e) {}
        s.execute("create table t (i int, v varchar(128))");
        
        PreparedStatement ins = 
            conn.prepareStatement("insert into t values (?, ?)");
        
        ins.setInt(1,0);
        ins.setString(2, "ABC");
        ins.execute();

        ins.setInt(1,1);
        ins.setString(2, "XYZ");
        ins.execute();

        ins.setInt(1,2);
        ins.setString(2, "");
        ins.execute();

        PreparedStatement ok = 
            conn.prepareStatement("select * from t where v like ''");
        ResultSet ok_rs = ok.executeQuery();
        while (ok_rs.next()) {
            System.out.println("ok: "+ok_rs.getObject(1) + " <" + 
                               ok_rs.getObject(2) + ">");
        }

        PreparedStatement bad = 
            conn.prepareStatement("select * from t where v like ?");
        bad.setString(1, "");
        ResultSet bad_rs = bad.executeQuery();
        while (bad_rs.next()) {
            System.out.println("bad: "+bad_rs.getObject(1) + " <" + 
                               bad_rs.getObject(2) + ">");
        }

This prints:

ok: 2 <>

-- 
dt

Reply via email to