当前位置: 首页 > 面试题库 >

BLOB与VARCHAR在MySQL表中存储数组

经景辉
2023-03-14
问题内容

我要做出设计决定,正在寻找一些最佳实践建议。我有一个Java程序,需要在MySQL数据库中存储大量(每天几百个)浮点数组。数据是长度Double为300
的固定长度数组。我可以看到三个合理的选择:

  1. 将数据存储为BLOB。
  2. 序列化数据并将其存储为VARCHAR。
  3. 将数据作为二进制文件写入磁盘,并存储对它的引用。

我还应该提到,该数据将被读取并经常更新。

我想使用BLOB,因为这是我过去所做的,并且这似乎是最有效的方法(例如,保持固定宽度且无需转换为逗号分隔的字符串)。但是我的同事坚持认为,我们应该序列化和使用varchar,其原因似乎主要是教条。

如果这些方法中的一种优于另一种,那么原因是Java还是MySQL特定?


问题答案:

像这样存储为BLOB(请参见下面的代码示例)。我认为这可能比使用Java序列化更好,因为Java的内置序列化将需要2427字节,并且非Java应用程序将很难处理数据。也就是说,将来是否应该有任何非Java应用程序查询数据库....如果没有,则内置序列化会少一些。

public static void storeInDB() throws IOException, SQLException {

    double[] dubs = new double[300];

    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    DataOutputStream dout = new DataOutputStream(bout);
    for (double d : dubs) {
        dout.writeDouble(d);
    }
    dout.close();
    byte[] asBytes = bout.toByteArray();

    PreparedStatement stmt = null;  // however we normally get this...
    stmt.setBytes(1, asBytes);

}

public static double[] readFromDB() throws IOException, SQLException {

    ResultSet rs = null;  // however we normally get this...
    while (rs.next()) {
        double[] dubs = new double[300];
        byte[] asBytes = rs.getBytes("myDoubles");
        ByteArrayInputStream bin = new ByteArrayInputStream(asBytes);
        DataInputStream din = new DataInputStream(bin);
        for (int i = 0; i < dubs.length; i++) {
            dubs[i] = din.readDouble();
        }
        return dubs;
    }

}

编辑:我希望使用BINARY(2400),但MySQL说:

mysql> create table t (a binary(2400)) ;
ERROR 1074 (42000): Column length too big for column 'a' (max = 255);
use BLOB or TEXT instead


 类似资料:
  • 问题内容: 我要做出设计决定,正在寻找一些最佳实践建议。我有一个Java程序,需要在MySQL数据库中存储大量(每天数百个)浮点数组。数据是长度为300 的固定长度数组。我可以看到三个合理的选择: 将数据存储为BLOB。 序列化数据并将其存储为VARCHAR。 将数据作为二进制文件写入磁盘,并存储对它的引用。 我还应该提到,该数据将被读取并经常更新。 我想使用BLOB,因为这是我过去所做的,并且这

  • 我认为问题是image的字节长度,因为当我得到字符串的长度()时,它大约是20万字节。 当我在字符串上做子字符串(3000)时,它很容易保存在BLOB列中。 那么问题到底在哪里?? 图像长度太长了吗? 或者我应该使用Oracle的任何其他数据类型? 我读到BLOB可以保存高达4GB的数据,那为什么不是我的??

  • 我正在处理一个Azure存储项目,其中我需要在容器中上传和下载blob,并在列表框中列出容器和blob。我无法在我的列表框中显示容器和blob。 最后是我调用上传、下载和列表方法的接口背后的代码:

  • 问题内容: 我正在尝试显示上传到MySql中“存储”表的最后5张图像。我对PHP和数据库完全陌生,并且我一直在阅读有关如何做到这一点的很多文章,但是没有运气。 我可以一次存储和显示图片,但我希望能够拥有各种各样的画廊来显示最近上传的5张照片。 任何建议或帮助将不胜感激,谢谢! 附言:我知道将图片存储到这样的数据库时不赞成这样做,但是该项目仅用于实践。 index.php get.php 问题答案:

  • 问题内容: 我已经搜索了很多有关此问题的信息,但是我没有针对我的问题找到合适的解决方案,我有以下使用Java存储文件的方法, 当我尝试运行此代码时,出现以下错误, 请帮助我。 问题答案: 将文件数据转换为字节数组并在sql语句中设置

  • 我正在创建多个 Azure 函数(HTTP 触发器)来从 blob 存储中获取内容,获取单个 blob 的几个元数据值,并获取特定 blob 类型的所有元数据属性。 我对使用绑定与使用blob存储的rest API与azure-storage sdk感到困惑。 创建azure函数时使用哪种方法最好?如果您能给我指出一些此类示例留档,那也会很有帮助。谢谢你。