2008-09-18 20 views
3

快速問題:我的客戶有一個情況,他的數據庫中有一個varchar字段,並且相應的jdbc代碼正在存儲/檢索布爾值。是否可以使用Java JDBC在varchar字段中存儲和檢索布爾值?

我猜布爾值false和true將被轉換爲「0」和「1」,但我想對此有一個確認(我無法在網上找到確切的行爲規範,也許它取決於每個驅動程序,在這種情況下是Oracle)。

我知道我可以自己試驗,但我想嘗試在stackoverflow.com!

感謝您的回答,

Eric。

+0

是否有任何有效的原因,該字段是一個varchar字段,而不是一個整數字段,如果他們將被存儲爲數字呢? – Dan 2008-09-18 03:30:16

回答

0

不幸的是,BOOLEAN語義是高度數據庫特定的。我是猜測,Oracle驅動程序將布爾值轉換爲VARCHAR字段爲「true」和「false」,而不是01,但您應該自己驗證。

+0

嘿,你也在這裏! 謝謝丹尼爾,我要檢查一下。 – user7611 2008-09-18 02:29:57

2

我同意這個答案,即語義是高度數據庫特定的,這就是爲什麼我認爲重要的答案是你不應該這樣做。 JDBC驅動程序或類似的東西的更改可能會導致隱式行爲中斷。

相反,如果使用原始JDBC,請將代碼採用布爾值並將其轉換爲適當的字符串('true'或'false'是顯而易見的選擇),然後將此值設置爲VARCHAR列。在從VARCHAR列讀取時,執行反向操作,引發或處理其中字符串不是預期的布爾值之一的異常情況。

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)); 
     } 
    } 
} 
+0

確認此代碼在Oracle 11g 11.1.0.6.0中使用Driver version 11.2.0.1.0將true/false插入爲1/0。 – 2011-03-18 11:35:15

1

感謝您的答案,

有點實驗後,我看到了甲骨文確實使用值0和1在varchar2列中存儲boolean值,而JDBC代碼中沒有任何映射。這就是說,如果我能提供一些背景知識,我們將解決這種情況,即事情只會「偶然」發揮作用。我只是想知道,在此期間,應用程序是否會炸燬。

而且,正如我所說的,我想看看從一開始就聽取Joel/Jeff播客之後,stackoverflow社區是多麼有效!

確實有效!

0

可以使用VARCHAR(2)來表示Oracle中的Java布爾值。不過,我會建議您不要這樣做,並建議您改用NUMBER(1)。如果布爾列上有一個索引,並且您在WHERE子句中使用它,則Oracle將對其應用to_number數字函數,以將「0」變爲0或將「1」變爲1。該函數的應用否定了該列上索引的使用,並會導致您進行全表掃描。

相關問題