2008-09-18 1 views
3

Быстрый вопрос: у моего клиента ситуация, когда у него есть база данных с полем varchar, а соответствующий код jdbc хранит/извлекает логическое значение.Можно ли хранить и извлекать логическое значение в поле varchar с помощью Java JDBC?

Я предполагаю, что логические значения false и true будут переведены на «0» и «1», но я хотел бы получить подтверждение этого (я не могу найти точные спецификации поведения в Интернете, может быть, это зависит от каждого драйвера, Oracle в этом случае).

Я знаю, что могу экспериментировать сам, но я хочу попробовать на stackoverflow.com!

Спасибо за ваш ответ,

Eric.

+0

Есть ли веская причина, что поле является полем varchar, а не целочисленным полем, если они все равно будут сохранены в виде чисел? – Dan 2008-09-18 03:30:16

ответ

0

К сожалению, семантика BOOLEAN очень специфична для конкретной базы данных. Я предполагаю, что драйвер Oracle собирается переводить логические значения в VARCHAR поле в «true» и «false», а не 0 и 1, но вы должны проверить это самостоятельно.

+0

Эй, ты здесь тоже! Спасибо, Дэниэл, я проверю это. – user7611 2008-09-18 02:29:57

2

Я согласен с ответом на то, что семантика очень специфична для базы данных, поэтому я считаю важным ответ, что вы не должны не должны. Изменение драйвера JDBC или что-то подобное может привести к разрыву неявного поведения.

Вместо этого, если используется необработанный JDBC, используйте этот код для булевого и преобразовать его в соответствующую строку ('true' или 'false' являются очевидным выбором), а затем установите это значение в столбце VARCHAR. При чтении из столбца VARCHAR сделайте обратное, бросая или обрабатывая случай исключения, когда String не является одним из логических значений, как ожидалось.

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

Подтвержденный код вставляет 1/0 для true/false с Oracle 11g 11.1.0.6.0 с использованием версии драйвера 11.2.0.1.0. – 2011-03-18 11:35:15

1

Спасибо за все ваши ответы,

После недолгих экспериментов я видел, что Oracle действительно используя значения 0 и 1 для хранения значений boolean в столбцах varchar2 без какого-либо сопоставления в коде JDBC.

Сказанное, если я могу дать немного контекста, мы исправим ту ситуацию, когда все будет работать «случайно». Я просто хотел знать, будет ли в то же время приложение взорваться.

И, как я уже сказал, я хотел видеть, насколько эффективно сообщество stackoverflow было после прослушивания подкастов Joel/Jeff с самого начала!

Это действительно эффективно!

0

Возможно использование VARCHAR (2) для представления Java Boolean в Oracle. Тем не менее, я бы посоветовал вам и предлагаю вместо этого использовать NUMBER (1). Если в столбце Boolean есть индекс, и вы используете его в предложении WHERE, Oracle будет применять к нему цифровую функцию to_number, чтобы превратить «0» в 0 или «1» в 1.Применение этой функции отрицает использование индекса в этом столбце и приведет к полному сканированию таблицы.

Смежные вопросы