如何检索存储为 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++;
}
}
您的代码显示了如何“解码”DATA
。 found.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了。
在交给我的一个项目中,有一个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++;
}
}
您的代码显示了如何“解码”DATA
。 found.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了。