快速提问:我的客户有一种情况,他的数据库包含varchar字段,相应的jdbc代码存储/检索布尔值。
我猜布尔值false和true将被转换为“0”和“1”,但我想对此进行确认(我无法在线找到精确的行为规范,可能取决于对于每个驱动程序,在本例中为Oracle。)
我知道我可以自己试验,但我想尝试一下stackoverflow.com!
感谢您的回答,
埃里克。
答案 0 :(得分:2)
我同意语义高度特定于数据库的答案,这就是为什么我认为重要的答案是你不应该这样做。 JDBC驱动程序或类似内容的更改可能会导致隐式行为中断。
相反,如果使用原始JDBC,请让代码获取布尔值并将其转换为适当的String('true'或'false'是明显的选择),然后将此值设置为VARCHAR列。从VARCHAR列读取时,执行相反的操作,抛出或处理异常情况,其中String不是预期的布尔值之一。
答案 1 :(得分:1)
它适用于MySQL,该表为0表示false,1表示true。
输出:
123 => true
456 => false
源代码:
package com.lurz.jdbc;
import java.sql.*;
// Test using Varchar for Boolean
public class BoolTest {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/booltest", "booltest", "booltest");
conn.prepareStatement("create table booltest (id bigint, truefalse varchar(10));").execute();
PreparedStatement stmt = conn.prepareStatement("insert into booltest (id, truefalse) values (?, ?);");
stmt.setLong(1, (long)123);
stmt.setBoolean(2, true);
stmt.execute();
stmt.setLong(1, (long)456);
stmt.setBoolean(2, false);
stmt.execute();
ResultSet rs = conn.createStatement().executeQuery("select id, truefalse from booltest");
while (rs.next()) {
System.out.println(rs.getLong(1)+ " => " + rs.getBoolean(2));
}
}
}
答案 2 :(得分:1)
感谢您的所有答案,
经过一些实验后,我发现Oracle确实使用值0和1在boolean
列中存储varchar2
值,而在JDBC代码中没有任何映射。
那就是说,如果我可以提供一些背景信息,我们将会解决那些事情会“偶然”发挥作用的情况。我只是想知道,在此期间,应用程序是否会爆炸。
而且,正如我所说,我想看看自从一开始就听过Joel / Jeff播客之后stackoverflow社区的效果如何!
确实有效!
答案 3 :(得分:0)
不幸的是,BOOLEAN
语义是高度特定于数据库的。我猜测 Oracle驱动程序将布尔值转换为VARCHAR
字段为“true
”和“false
”,而不是{{ 1}}和0
,但您应该自己验证。
答案 4 :(得分:0)
可以使用VARCHAR(2)表示Oracle中的Java布尔值。但是,我建议反对它并建议您使用NUMBER(1)代替。如果布尔列上有索引并且您在WHERE子句中使用它,Oracle将在其上应用to_number数字函数将“0”变为0或将“1”变为1.该函数的应用否定了在该列上使用索引,将导致您进行全表扫描。