我认为问题是你的数据类型是CHAR(9)而“滑铁卢”只有8个字符.
我假设这会返回预期的结果(LIKE和%).或者添加缺少的空间.
String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();
如果你的字符串具有灵活的长度,最好的方法是使用varchar而不是char.然后PreparedStatement将按预期工作.
解决方法是使用Oracle特定的setFixedCHAR方法(但如果可能,最好将数据类型更改为varchar).
以下内容来自Oracle的PreparedStatement JavaDoc:
数据库中的CHAR数据填充到列宽.这导致使用setCHAR()方法将字符数据绑定到SELECT语句的WHERE子句中的限制 – WHERE子句中的字符数据也必须填充到列宽以在SELECT语句中生成匹配.如果您不知道列宽,这尤其麻烦.
setFixedCHAR()可以解决这个问题.此方法执行非填充比较.
笔记:
>请记住将准备好的语句对象强制转换为OraclePreparedStatement以使用setFixedCHAR()方法.
>不需要对INSERT语句使用setFixedCHAR().数据库在插入数据时始终自动将数据填充到列宽.
以下示例演示了setString(),setCHAR()和setFixedCHAR()方法之间的区别.
// Schema is : create table my_table (col1 char(10));
// insert into my_table values ('JDBC');
PreparedStatement pstmt = conn.prepareStatement
("select count() from my_table where col1 = ?");
ResultSet rs;
pstmt.setString (1, "JDBC"); // Set the Bind Value
rs = pstmt.executeQuery(); // This does not match any row
// ... do something with rs
CHAR ch = new CHAR("JDBC ", null);
((OraclePreparedStatement)pstmt).setCHAR(1, ch); // Pad it to 10 bytes
rs = pstmt.executeQuery(); // This matches one row
// ... do something with rs
((OraclePreparedStatement)pstmt).setFixedCHAR(1, "JDBC");
rs = pstmt.executeQuery(); // This matches one row
// ... do something with rs