以下是从官网说明摘录下来的: http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html从你贴出来的SQL截图来看,该类型用使用者是透明的,对吧,但是你要在代码中使用,则需要自己解析格式啦。LONGBLOBA 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.
mysql当中可不是这么规定的。
你不存入任何数据时,其内容为NULL,怎么会有长度值。
应该是你们自己存储数据时,显示的用长度+内容来存入的。
还是检查一下自己的代码,看看哪个地方出了问题。
问题是不存在数据的字段我本就没有对它进行操作,只对有数据的字段进行了更新,但是在的所有记录时,未操作的longblob莫名其妙的的有了四个字节的长度,转换成int数值是1280070990
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)
看看这个就知道了。
{
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;
}
{
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;
}
http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html从你贴出来的SQL截图来看,该类型用使用者是透明的,对吧,但是你要在代码中使用,则需要自己解析格式啦。LONGBLOBA 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.