3

簡単な質問: 私の顧客は、データベースに varchar フィールドがあり、対応する jdbc コードがブール値を格納/取得している状況にあります。

ブール値の false と true は "0" と "1" に変換されると思いますが、これを確認したいと思います (オンラインで正確な動作仕様を見つけることができません。おそらく各ドライバーに依存します) 、この場合はOracle)。

自分で実験できることはわかっていますが、stackoverflow.com で試してみたいと思います。

ご回答有難うございます、

エリック。

4

5 に答える 5

2

セマンティクスはデータベースに非常に固有であるという回答に同意します。そのため、重要な回答は、これを行うべきではないということだと思います。JDBC ドライバーなどの変更により、暗黙的な動作が壊れる可能性があります。

代わりに、生の JDBC を使用している場合は、コードでブール値を取得して適切な文字列に変換し ('true' または 'false' は明らかな選択肢です)、この値を VARCHAR 列に設定します。VARCHAR 列からの読み取りでは、文字列が期待どおりのブール値の 1 つではない例外ケースをスローまたは処理して、逆の処理を行います。

于 2008-09-18T02:31:53.133 に答える
1

ご回答ありがとうございます。

少し実験した後、Oracle が実際に値 0 と 1 を使用して、JDBC コードでのマッピングなしbooleanで列に値を格納していることがわかりました。varchar2

とはいえ、少し状況を説明できれば、「偶然に」機能する状況を修正します。それまでの間、アプリケーションが爆発するかどうかを知りたかっただけです。

そして、私が言ったように、最初から Joel/Jeff ポッドキャストを聞いた後、stackoverflow コミュニティがどれほど効果的であるかを知りたかったのです!

それは確かに効果的です!

于 2008-09-18T03:38:36.330 に答える
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));
      }  
   }
}
于 2008-09-18T02:39:34.660 に答える
0

残念ながら、BOOLEANセマンティクスは非常にデータベース固有です。Oracle ドライバーは、フィールドへのブール値を と ではなく " "と " " に変換しようとしていると思いますが、これは自分で確認する必要があります。VARCHARtruefalse01

于 2008-09-18T02:13:27.063 に答える
0

Oracle では、Java ブール値を表すために VARCHAR(2) を使用できます。ただし、代わりに NUMBER(1) を使用することをお勧めします。ブール列にインデックスがあり、それを WHERE 句で使用する場合、Oracle は to_number 数値関数を適用して、"0" を 0 に、または "1" を 1 に変換します。その列のインデックスを使用すると、テーブル全体のスキャンが発生します。

于 2012-09-17T20:26:50.437 に答える