我在一个表中有多个longblob字段,当字段中存入数据是读出是正确的,但如果某个字段没有存入数据,在读这个字段的长度时,得到结果是长度为四,转换成int数值是1280070990,没有写入数据读出不是应该为空,长度是零吗?为什么出现这种情况,怎么才能解决呢?谢谢。

解决方案 »

  1.   

    LONGBLOB 类型是变长类型,它的内容格式是:内容长度:内容。当然,对用户是透明的,实际取内容的时候不会把“内容长度”取出来。该内容长度不管有没有内容都会存在的,需要四个字节来保存,因此有你的那个现象了。
      

  2.   

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

  3.   


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

  4.   


    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)
    看看这个就知道了。
      

  5.   

    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;
    }
      

  6.   

    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;
    }
      

  7.   

    单步调试跟踪一下insert操作,看看blob字段绑定了什么值进去了。
      

  8.   

    估计是INSERT进去了什么东西。检查一下你的代码。
      

  9.   

    以下是从官网说明摘录下来的:
    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.