2008-09-18 8 views
3

빠른 질문 : 고객이 자신의 데이터베이스에 varchar 필드가 있고 해당 jdbc 코드가 부울을 저장/검색하고있는 상황이 있습니다.Java JDBC를 사용하여 varchar 필드에 부울 값을 저장하고 검색 할 수 있습니까?

부울 값 false와 true는 "0"과 "1"로 변환 될 것이라고 추측합니다. 그러나 이것에 대한 확인을하고 싶습니다. 온라인으로 정확한 동작 사양을 찾을 수 없습니다. 이 경우에는 각 드라이버, Oracle에 따라 다릅니다).

나는 혼자서 실험 할 수 있지만, 나는 stackoverflow.com에서 시험해보고 싶다!

답장을 보내 주셔서 감사합니다.

Eric.

+0

어쨌든 숫자로 저장하려고하는 경우 필드가 varchar 필드이고 정수 필드가 아닌 유효한 이유가 있습니까? – Dan

답변

0

불행히도 BOOLEAN 의미론은 데이터베이스와 관련성이 매우 높습니다. 나는 입니다.은 오라클 드라이버가 01 대신 "true"과 "false"으로 부울 값을 VARCHAR 필드로 변환하지만 사용자가 직접 확인해야합니다.

+0

이봐, 네가 왔어! 감사합니다. Daniel, 나는 그것을 점검 할 것입니다. – user7611

2

의미론이 데이터베이스와 관련성이 높다는 답변에 동의합니다. 중요한 대답은 당신이 이 아니어야합니다.이 작업을 수행해야한다는 것입니다. JDBC 드라이버 또는 이와 유사한 것이 변경되면 암시 적 동작이 중단 될 수 있습니다.

대신 원시 JDBC를 사용하는 경우 코드를 부울로 가져 와서 해당 문자열 ('true'또는 'false'가 확실한 선택 항목)로 변환 한 다음이 값을 VARCHAR 열로 설정하십시오. VARCHAR 열에서 읽은 문자열이 예상대로 부울 값 중 하나가 아닌 예외 상황을 던지거나 처리하는 반대 작업을 수행합니다.

1

MySQL과 함께 작동하며, 테이블은 false를 0으로, true를 1로 유지합니다.

출력 :

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

이 코드는 드라이버 버전 11.2.0.1.0을 사용하여 Oracle 11g 11.1.0.6.0에서 true/false에 1/0을 삽입합니다. –

1

감사합니다,

실험 조금 후에 내가 본 오라클은 실제로 값 0을 사용하는 것을 1은 boolean 값을 varchar2 컬럼에 저장하고 JDBC 코드에 맵핑하지 않습니다.

그렇다면 상황을 조금만 줄 수 있다면 상황이 "우연히"작동하는 상황을 해결할 것입니다. 나는 그동안 응용 프로그램이 폭발 할 것인지를 알고 싶었습니다.

그리고 내가 말했듯이 처음부터 Joel/Jeff Podcast를 들었을 때 stackoverflow 커뮤니티가 얼마나 효과적 이었는지보고 싶었습니다!

실제로 효과적입니다!

0

Oracle에서 Java Boolean을 나타내는 데 VARCHAR (2)를 사용할 수 있습니다. 그러나, 나는 그것을 반대하고 대신 NUMBER (1)을 사용할 것을 제안합니다. Boolean 열에 인덱스가 있고 WHERE 절에서이 인덱스를 사용하면 Oracle은 to_number 숫자 함수를 적용하여 "0"을 0으로, "1"을 1로 바꿉니다.해당 함수를 적용하면 해당 열의 인덱스 사용이 무효화되어 전체 테이블 스캔이 발생하게됩니다.