求助longblob问题

mingguang7213 2011-08-10 11:04:24
我在一个表中有多个longblob字段,当字段中存入数据是读出是正确的,但如果某个字段没有存入数据,在读这个字段的长度时,得到结果是长度为四,转换成int数值是1280070990,没有写入数据读出不是应该为空,长度是零吗?为什么出现这种情况,怎么才能解决呢?谢谢。
...全文
257 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicenight 2011-08-10
  • 打赏
  • 举报
回复
LONGBLOB 类型是变长类型,它的内容格式是:内容长度:内容。当然,对用户是透明的,实际取内容的时候不会把“内容长度”取出来。该内容长度不管有没有内容都会存在的,需要四个字节来保存,因此有你的那个现象了。
mingguang7213 2011-08-10
  • 打赏
  • 举报
回复
哪位前辈遇到过类似的问题啊
mingguang7213 2011-08-10
  • 打赏
  • 举报
回复
哪位大佬给解答一下啊
nicenight 2011-08-10
  • 打赏
  • 举报
回复
以下是从官网说明摘录下来的:
http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

从你贴出来的SQL截图来看,该类型用使用者是透明的,对吧,但是你要在代码中使用,则需要自己解析格式啦。

LONGBLOB

A BLOB column with a maximum length of 4,294,967,295 or 4GB (232 – 1) bytes. The effective maximum length of LONGBLOB columns depends on the configured maximum packet size in the client/server protocol and available memory. Each LONGBLOB value is stored using a four-byte length prefix that indicates the number of bytes in the value.
ACMAIN_CHM 2011-08-10
  • 打赏
  • 举报
回复
估计是INSERT进去了什么东西。检查一下你的代码。
iihero 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mingguang7213 的回复:]

像上边给出的代码,在保存数据块长度等于0时,我本身就没有把这个数据块向相应的字段中写,但在的整条记录时,这个没有操作的字段读出了四个字节的长度
[/Quote]
单步调试跟踪一下insert操作,看看blob字段绑定了什么值进去了。
mingguang7213 2011-08-10
  • 打赏
  • 举报
回复
像上边给出的代码,在保存数据块长度等于0时,我本身就没有把这个数据块向相应的字段中写,但在的整条记录时,这个没有操作的字段读出了四个字节的长度
mingguang7213 2011-08-10
  • 打赏
  • 举报
回复
try
{
EsExeSql::FieldInfo fi;
EsExeSql::PointerSet ps;

fi.push_back(make_pair("modelId", EsExeSql::TB_INT));
fi.push_back(make_pair("faultName", EsExeSql::TB_STRING));
fi.push_back(make_pair("faultRank", EsExeSql::TB_INT));
fi.push_back(make_pair("lockMark", EsExeSql::TB_BOOL));
fi.push_back(make_pair("usingMark", EsExeSql::TB_BOOL));
fi.push_back(make_pair("faultArea", EsExeSql::TB_DOUBLE));

ps.push_back((void*)&m_nModelID);
ps.push_back((void*)&m_strFaultName);
ps.push_back((void*)&m_nFaultLevel);
ps.push_back((void*)&m_bIsLocked);
ps.push_back((void*)&m_bIsUsed);
ps.push_back((void*)&m_dbFaceArea);

if (m_obDataPoint.m_nLen > 0 && m_obDataPoint.m_pData)
{
fi.push_back(make_pair("scatterPoint", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obDataPoint);
}

if (m_obCtrlPoint.m_nLen > 0 && m_obCtrlPoint.m_pData)
{
fi.push_back(make_pair("controlPoint", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obCtrlPoint);
}

if (m_obArris.m_nLen > 0 && m_obArris.m_pData)
{
fi.push_back(make_pair("faultArris", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obArris);
}

if (m_obFaultEdge.m_nLen > 0 && m_obFaultEdge.m_pData)
{
fi.push_back(make_pair("faultEdges", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obFaultEdge);
}

if (m_obFaultTri.m_nLen > 0 && m_obFaultTri.m_pData)
{
fi.push_back(make_pair("faultTriangleGrid", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obFaultTri);
}

if (m_obFaultInfo.m_nLen > 0 && m_obFaultInfo.m_pData)
{
fi.push_back(make_pair("faultInfo", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obFaultInfo);
}

if (m_obBox.m_nLen > 0 && m_obBox.m_pData)
{
fi.push_back(make_pair("boxInfo", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obBox);
}


unsigned long long unId = 0;
char tablename[256];
memset(tablename, 0, 256);
sprintf_s(tablename, "%s.FAULT_DATA_INFO", EsMySql::EsGetCurrentUseDB().c_str());

bool bRet = EsExeSql::EsInsertBlob(tablename, fi, ps, &unId);
m_nFaultID = unId;
return m_nFaultID;

}
catch (const Exception& er)
{
string strErr = _T("Error:");
strErr += er.what();
AfxMessageBox(strErr.c_str());

return -1;
}
mingguang7213 2011-08-10
  • 打赏
  • 举报
回复
try
{
EsExeSql::FieldInfo fi;
EsExeSql::PointerSet ps;

fi.push_back(make_pair("modelId", EsExeSql::TB_INT));
fi.push_back(make_pair("faultName", EsExeSql::TB_STRING));
fi.push_back(make_pair("faultRank", EsExeSql::TB_INT));
fi.push_back(make_pair("lockMark", EsExeSql::TB_BOOL));
fi.push_back(make_pair("usingMark", EsExeSql::TB_BOOL));
fi.push_back(make_pair("faultArea", EsExeSql::TB_DOUBLE));

ps.push_back((void*)&m_nModelID);
ps.push_back((void*)&m_strFaultName);
ps.push_back((void*)&m_nFaultLevel);
ps.push_back((void*)&m_bIsLocked);
ps.push_back((void*)&m_bIsUsed);
ps.push_back((void*)&m_dbFaceArea);

if (m_obDataPoint.m_nLen > 0 && m_obDataPoint.m_pData)
{
fi.push_back(make_pair("scatterPoint", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obDataPoint);
}

if (m_obCtrlPoint.m_nLen > 0 && m_obCtrlPoint.m_pData)
{
fi.push_back(make_pair("controlPoint", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obCtrlPoint);
}

if (m_obArris.m_nLen > 0 && m_obArris.m_pData)//像这我本身没有对其进行操作因为数据块长度为零,但我在读取是会有四个字节长度
{
fi.push_back(make_pair("faultArris", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obArris);
}

if (m_obFaultEdge.m_nLen > 0 && m_obFaultEdge.m_pData)
{
fi.push_back(make_pair("faultEdges", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obFaultEdge);
}

if (m_obFaultTri.m_nLen > 0 && m_obFaultTri.m_pData)
{
fi.push_back(make_pair("faultTriangleGrid", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obFaultTri);
}

if (m_obFaultInfo.m_nLen > 0 && m_obFaultInfo.m_pData)
{
fi.push_back(make_pair("faultInfo", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obFaultInfo);
}

if (m_obBox.m_nLen > 0 && m_obBox.m_pData)
{
fi.push_back(make_pair("boxInfo", EsExeSql::TB_BLOB));
ps.push_back((void*)&m_obBox);
}


unsigned long long unId = 0;
char tablename[256];
memset(tablename, 0, 256);
sprintf_s(tablename, "%s.FAULT_DATA_INFO", EsMySql::EsGetCurrentUseDB().c_str());

bool bRet = EsExeSql::EsInsertBlob(tablename, fi, ps, &unId);
m_nFaultID = unId;
return m_nFaultID;

}
catch (const Exception& er)
{
string strErr = _T("Error:");
strErr += er.what();
AfxMessageBox(strErr.c_str());

return -1;
}
iihero 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mingguang7213 的回复:]

问题是不存在数据的字段我本就没有对它进行操作,只对有数据的字段进行了更新,但是在的所有记录时,未操作的longblob莫名其妙的的有了四个字节的长度,转换成int数值是1280070990
[/Quote]

mysql> create table tlb(id int primary key, col2 longblob);
Query OK, 0 rows affected (0.11 sec)

mysql> insert into tlb values(1, null);
Query OK, 1 row affected (0.00 sec)

mysql> insert into tlb values(2, 0xAB);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tlb values(3, '');
Query OK, 1 row affected (0.00 sec)

mysql> select length(col2) from tlb;
+--------------+
| length(col2) |
+--------------+
| NULL |
| 1 |
| 0 |
+--------------+
3 rows in set (0.00 sec)


看看这个就知道了。
mingguang7213 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 iihero 的回复:]
引用 5 楼 mingguang7213 的回复:

为什么我在存入数据后,在得到的长度就不包含这四个字节了呢

这个是不是你们自己人为造成的。
mysql当中可不是这么规定的。
你不存入任何数据时,其内容为NULL,怎么会有长度值。
应该是你们自己存储数据时,显示的用长度+内容来存入的。
还是检查一下自己的代码,看看哪个地方出了问题。
[/Quote]

问题是不存在数据的字段我本就没有对它进行操作,只对有数据的字段进行了更新,但是在的所有记录时,未操作的longblob莫名其妙的的有了四个字节的长度,转换成int数值是1280070990
iihero 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mingguang7213 的回复:]

为什么我在存入数据后,在得到的长度就不包含这四个字节了呢
[/Quote]
这个是不是你们自己人为造成的。
mysql当中可不是这么规定的。
你不存入任何数据时,其内容为NULL,怎么会有长度值。
应该是你们自己存储数据时,显示的用长度+内容来存入的。
还是检查一下自己的代码,看看哪个地方出了问题。
mingguang7213 2011-08-10
  • 打赏
  • 举报
回复
为什么我在存入数据后,在得到的长度就不包含这四个字节了呢
rucypli 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nicenight 的回复:]
LONGBLOB 类型是变长类型,它的内容格式是:内容长度:内容。当然,对用户是透明的,实际取内容的时候不会把“内容长度”取出来。该内容长度不管有没有内容都会存在的,需要四个字节来保存,因此有你的那个现象了。
[/Quote]
学习

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧