是否可以使用Java JDBC在varchar字段中存储和检索布尔值?

时间:2008-09-18 02:01:09

标签: java jdbc types resultset

快速提问:我的客户有一种情况,他的数据库包含varchar字段,相应的jdbc代码存储/检索布尔值。

我猜布尔值false和true将被转换为“0”和“1”,但我想对此进行确认(我无法在线找到精确的行为规范,可能取决于对于每个驱动程序,在本例中为Oracle。)

我知道我可以自己试验,但我想尝试一下stackoverflow.com!

感谢您的回答,

埃里克。

5 个答案:

答案 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.该函数的应用否定了在该列上使用索引,将导致您进行全表扫描。