MySQL C API处理TEXT字段

当使用MySQL C API中的Prepared Statements来处理TEXT字段结果时,必须指定out绑定的字符串长度:

MYSQL_BIND out_bind; char str_data[STRING_SIZE]; my_bool is_null; my_bool error; .... /* STRING COLUMN */ out_bind.buffer_type = MYSQL_TYPE_STRING; out_bind.buffer = str_data; out_bind.buffer_length = STRING_SIZE; out_bind.is_null= &is_null; out_bind.length= &length; out_bind.error= &error; mysql_stmt_bind_result(statement, out_bind) 

在给定的示例中,STRING_SIZE是已知常量,但如何使用TEXT字段,其中数据长度可以从小尺寸变为兆字节?

这有标准的方法吗?

mysql_stmt_fetch的手册页说:

在某些情况下,您可能希望在使用mysql_stmt_fetch()获取列值之前确定列值的长度。 …要完成此任务,您可以使用以下策略:

  • 在调用mysql_stmt_fetch()以检索单个行之前,将STMT_ATTR_UPDATE_MAX_LENGTH传递给mysql_stmt_attr_set() ,然后调用mysql_stmt_store_result()以缓冲客户端的整个结果。 设置STMT_ATTR_UPDATE_MAX_LENGTH属性会导致列值的最大长度由mysql_stmt_result_metadata()返回的结果集元数据的max_length成员指示。

  • 为所讨论的列调用带有零长度缓冲区的mysql_stmt_fetch()和一个可以存储实际长度的指针。 然后使用mysql_stmt_fetch_column()的实际长度。

您可能还想阅读mysql_stmt_bind_result的手册页

我遇到过同样的问题。 我已经解决了这个问题,就像pmg在第一点说的那样,使用STMT_ATTR_UPDATE_MAX_LENGTH设置,这是我的代码:

 MYSQL_STMT *stmt; MYSQL_BIND bind[1]; MYSQL_BIND bind_result[1]; // _con your mysql connection stmt = mysql_stmt_init(_con); if (!stmt) { fprintf(stderr, " mysql_stmt_init(), out of memory\n"); exit(0); } char* aQuery = (char*) "'your query'"; if (mysql_stmt_prepare(stmt, aQuery, strlen(aQuery))) { fprintf(stderr, " mysql_stmt_prepare(), INSERT failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } // Here fill binded parameters (here a string) memset(bind, 0, sizeof(bind)); const char* aStr = ioType.c_str(); long unsigned int aSize = ioType.size(); bind[0].buffer_type= MYSQL_TYPE_STRING; bind[0].buffer= (char *) aStr; bind[0].buffer_length= 2048; bind[0].is_null= 0; bind[0].length= &aSize; /* Bind the buffers */ if (mysql_stmt_bind_param(stmt, bind)) { fprintf(stderr, " mysql_stmt_bind_param() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } // Reauest meta data information MYSQL_RES* aRes = mysql_stmt_result_metadata(stmt); // Set STMT_ATTR_UPDATE_MAX_LENGTH attribute my_bool aBool = 1; mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &aBool); /* Execute the select statement - 1*/ if (mysql_stmt_execute(stmt)) { fprintf(stderr, " mysql_stmt_execute(), 1 failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } if (mysql_stmt_store_result(stmt)) { fprintf(stderr, " mysql_stmt_execute(), 1 failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } // Retrieving meta data information MYSQL_FIELD* aField = &aRes->fields[0]; fprintf(stdout, " field %s \n",aField->name); fprintf(stdout, " field length %d \n",(int) aField->length); fprintf(stdout, " field max length %d \n", (int) aField->max_length); int totalrows = mysql_stmt_num_rows(stmt); fprintf(stdout, " fetched %d description\n",totalrows); fprintf(stdout, " field count %d \n",(int) aRes->field_count); long unsigned int aMaxSize; char* aBuffer = (char*) malloc(aField->max_length); memset (bind_result, 0, sizeof (bind_result)); bind_result[0].buffer_type= MYSQL_TYPE_BLOB; bind_result[0].is_null= 0; bind_result[0].buffer= (char *) aBuffer; bind_result[0].buffer_length= aField->max_length; bind_result[0].length= &aMaxSize; mysql_stmt_bind_result(stmt, bind_result); std::string aStrData; while(!mysql_stmt_fetch(stmt)) { fprintf(stdout, " size %d\n", (int) aMaxSize); aStrData = std::string(aBuffer,aMaxSize); fprintf(stdout, " data %s\n", aStrData.c_str()); } free(aBuffer); mysql_free_result(aRes); if (mysql_stmt_close(stmt)) { fprintf(stderr, " failed while closing the statement\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } 

希望这可以帮助 !