在傳遞給我的一個專案中,有一個 MySQL 資料庫用于存盤大量資料。每個資料庫都有一個包含大量文本片段(4 個字符)的表,其組織如下:
id (long,increment)、text(char(4))、count (varchar) 和 DATA (Mediumblob)
DATA 將 long 陣列存盤為二進制,但如果我在表上選擇,它會被描述為神秘符號。

我已經嘗試了多個 CONVERT 和 CAST 命令,但它從來沒有產生我可以以某種方式使用的東西。我需要在這里編碼的內容,所以有什么想法可以嘗試嗎?
我檢查了所有 Java 代碼,但我無法真正了解該列是如何填充資料的。這似乎是 Hibernate 軟體包的一個奇跡。我發現的最后一個實際電話是
found.addSeq(seq.getId());
其中 found 是實體化 entity=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 ;
}
}
uj5u.com熱心網友回復:
您的代碼顯示了如何“解碼” DATA. found.getData()將回傳當前物體資料的二進制內容:找到。然后您可以呼叫類似的邏輯來顯示或從 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,然后您可以按預期顯示長值串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/476390.html
