快速問題:我的客戶有一個情況,他的數據庫中有一個varchar字段,並且相應的jdbc代碼正在存儲/檢索布爾值。是否可以使用Java JDBC在varchar字段中存儲和檢索布爾值?
我猜布爾值false和true將被轉換爲「0」和「1」,但我想對此有一個確認(我無法在網上找到確切的行爲規範,也許它取決於每個驅動程序,在這種情況下是Oracle)。
我知道我可以自己試驗,但我想嘗試在stackoverflow.com!
感謝您的回答,
Eric。
快速問題:我的客戶有一個情況,他的數據庫中有一個varchar字段,並且相應的jdbc代碼正在存儲/檢索布爾值。是否可以使用Java JDBC在varchar字段中存儲和檢索布爾值?
我猜布爾值false和true將被轉換爲「0」和「1」,但我想對此有一個確認(我無法在網上找到確切的行爲規範,也許它取決於每個驅動程序,在這種情況下是Oracle)。
我知道我可以自己試驗,但我想嘗試在stackoverflow.com!
感謝您的回答,
Eric。
不幸的是,BOOLEAN
語義是高度數據庫特定的。我是猜測,Oracle驅動程序將布爾值轉換爲VARCHAR
字段爲「true
」和「false
」,而不是0
和1
,但您應該自己驗證。
嘿,你也在這裏! 謝謝丹尼爾,我要檢查一下。 – user7611 2008-09-18 02:29:57
我同意這個答案,即語義是高度數據庫特定的,這就是爲什麼我認爲重要的答案是你不應該這樣做。 JDBC驅動程序或類似的東西的更改可能會導致隱式行爲中斷。
相反,如果使用原始JDBC,請將代碼採用布爾值並將其轉換爲適當的字符串('true'或'false'是顯而易見的選擇),然後將此值設置爲VARCHAR列。在從VARCHAR列讀取時,執行反向操作,引發或處理其中字符串不是預期的布爾值之一的異常情況。
它適用於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));
}
}
}
確認此代碼在Oracle 11g 11.1.0.6.0中使用Driver version 11.2.0.1.0將true/false插入爲1/0。 – 2011-03-18 11:35:15
感謝您的答案,
有點實驗後,我看到了甲骨文確實使用值0和1在varchar2
列中存儲boolean
值,而JDBC代碼中沒有任何映射。這就是說,如果我能提供一些背景知識,我們將解決這種情況,即事情只會「偶然」發揮作用。我只是想知道,在此期間,應用程序是否會炸燬。
而且,正如我所說的,我想看看從一開始就聽取Joel/Jeff播客之後,stackoverflow社區是多麼有效!
確實有效!
可以使用VARCHAR(2)來表示Oracle中的Java布爾值。不過,我會建議您不要這樣做,並建議您改用NUMBER(1)。如果布爾列上有一個索引,並且您在WHERE子句中使用它,則Oracle將對其應用to_number數字函數,以將「0」變爲0或將「1」變爲1。該函數的應用否定了該列上索引的使用,並會導致您進行全表掃描。
是否有任何有效的原因,該字段是一個varchar字段,而不是一個整數字段,如果他們將被存儲爲數字呢? – Dan 2008-09-18 03:30:16