【问题标题】:JDBC, MySQL: getting bits into a BIT(M!=1) columnJDBC,MySQL:将位放入 BIT(M!=1) 列
【发布时间】:2010-12-08 18:43:02
【问题描述】:

我是使用 JDBC + MySQL 的新手。

我有几个 1/0 值,我想使用 PreparedStatement 将它们粘贴到数据库中。目标列是 BIT(M!=1)。我不清楚使用哪种 setXXX 方法。我可以很容易地找到哪些数据出来的参考,但它是如何输入的却让我望而却步。

值在应用程序使用的对象中有效地作为布尔值的有序集合存在。另外,我偶尔会从 1/0 字符的纯文本文件中导入数据。

【问题讨论】:

  • 顺便说一句,在 java 中将位存储为布尔数组是对内存的巨大浪费。 boolean 的具体大小取决于运行时环境实现,通常介于 1-4 字节(!)之间。考虑使用 java.util.BitSet
  • 关于您的要求。 jdbc 连接器没有明智的方式可以理解布尔 [] 而无需转换为 BIT(M)。您必须将数组转换为更合适的东西。如果为我的解决方案转换为 String 或转换为 byte[] 是您的选择
  • 嗯,它实际上并不是一个布尔数组。我有一个有序的可区分二进制值集合。

标签: java mysql jdbc prepared-statement


【解决方案1】:

在 MySQL 中设置 BIT(M)

对于M==1

setBoolean(int parameterIndex, boolean x)

来自 javadoc

将指定参数设置为 给定 Java 布尔值。司机 将其转换为 SQL BIT 值时 它将它发送到数据库。


M>1

支持BIT(M),其中M!=1 对JDBC 有问题,因为BIT(M) 只有“完整”SQL-92 才需要,而且只有少数数据库支持。

在这里查看Mapping SQL and Java Types: 8.3.3 BIT

以下内容适用于 MySQL(至少适用于 MySQL 5.0.45、Java 1.6 和 MySQL Connector/J 5.0.8)

...
PreparedStatement insert = con.prepareStatement(
    "INSERT INTO bittable (bitcolumn) values (b?)"
);
insert.setString(1,"111000");
...

这使用 MySQL 的特殊 b'110101010' 语法来设置 BIT 列的值。

【讨论】:

  • 我的问题是专门针对 M!=1;我将进行编辑以使其更加明显。
  • 解决方案的扩展答案
  • 当我导入我的同事文本文件时,这非常适用。对于非导入案例,我仍然希望避免从数据转换为字符串。
【解决方案2】:

您可以将 get/setObject 与字节数组 (byte[]) 一起使用。每个字节包含 8 位,最低有效位在最后一个数组元素中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2011-02-25
    • 1970-01-01
    • 2021-12-08
    • 2012-05-19
    • 2011-04-16
    • 2018-03-13
    相关资源
    最近更新 更多