Можно ли сохранить и получить логическое значение в поле varchar, используя Java JDBC? - PullRequest
3 голосов
/ 18 сентября 2008

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

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

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

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

Эрик.

Ответы [ 5 ]

2 голосов
/ 18 сентября 2008

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

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

1 голос
/ 18 сентября 2008

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

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

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

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

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

1 голос
/ 18 сентября 2008

Работает с 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 голосов
/ 18 сентября 2012

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

0 голосов
/ 18 сентября 2008

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

...