如何检索存储为 mediumblob 的 MySQL 列内容?

How to retrieve MySQL column content stored as mediumblob?

在交给我的一个项目中,有一个MySQL数据库,用于存储大量数据。每个数据库都有一个 table,其中包含许多组织如下的文本片段(4 个字符):

id(长,增量)、text(char(4))、count(varchar)和 DATA(Mediumblob)

DATA 将 long 数组存储为二进制,但如果我 select 在 table 上,它会描述为神秘符号。

我已经尝试了多个 CONVERT 和 CAST 命令,但它从来没有产生我可以以某种方式使用的东西。我需要这里编码的内容,所以我可以尝试做什么?

我检查了所有 Java 代码,但我无法真正了解此列首先是如何填充数据的。这似乎是 Hibernate 包的一个奇迹。我发现的最后一个实际调用是

found.addSeq(seq.getId());

在何处找到实例化实体=table 并且 addSeq 执行以下操作:

public void addSeq(long id)
{
    ensure(seqsCount);
    seqs[seqsCount]=id;
    seqsCount++;
}

并确保()这个:

private void ensure(int minSize)
{
    if(seqs.length<=minSize)
    {
        long tmp[]=new long[minSize<20 ? minSize+5 : minSize+20];
        System.arraycopy(seqs, 0, tmp, 0, seqsCount);
        
        seqs=tmp;
    }
}

关于列 DATA 的唯一提示是这两个函数,但它们从未在代码中的任何地方被调用。知道这是如何工作的吗?

@Column(name = "DATA", unique = false, nullable = false, length=8000000)
public byte[] getData()
{
    ByteBuffer b=ByteBuffer.allocate(seqsCount*8);
    for(int i=0; i<seqsCount; i++)
    {
        b.putLong(seqs[i]);
    }

    return b.array();
}

public void setData(byte[] data)
{
    seqs=new long[data.length/8];
    seqsCount=0;
    
    ByteBuffer b=ByteBuffer.wrap(data);
    while(b.hasRemaining())
    {
        ensure(seqsCount);
        seqs[seqsCount]=b.getLong();
        seqsCount++;
    }
}

您的代码显示了如何“解码”DATAfound.getData() 将return 当前实体数据的二进制内容:找到。然后就可以调用类似的逻辑来展示或获取byte[]数据中的数据了。

public List<long> fetchData(byte[] data)
{
    long res=new long[data.length/8];
    int k=0;
    ByteBuffer b=ByteBuffer.wrap(data);
    while(b.hasRemaining())
    {
        res[k++] = b.getLong();
    }
}

使用fetchData,然后你就可以如你所愿的显示long值的List了。