MYSQL_ROW和row [0]到字符串类型?

时间:2008-11-08 22:34:04

标签: mysql c api c-strings

使用MYSQL C API查询结果时。结果以MYSQL_ROW类型返回,根据MYSQL C API文档,我可以轻松地printf("%s", row[0])。但是,如果我想将row[0]的内容转换为字符串或char *?

,该怎么办?

3 个答案:

答案 0 :(得分:1)

%s格式只能接受char *所以从你的描述来看,看起来MYSQL_ROW实际上是一个char **,而且[0]行将产生一个char *。

我不知道如何使用sprintf()(或更安全但非标准的asprintf())会有什么好处,但如果它让你感觉更好,你可以考虑它。

答案 1 :(得分:0)

你可以使用sprintf(),但你仍然需要知道row [0]中包含的字符串的长度,这样你就可以分配足够的内存。

警告:BCS正确地指出,如果row [0]包含额外的nul字节,您的数据将被截断。如果您知道在行[0]中存储了多少数据,则使用memcpy()可能是更好的解决方案。

答案 2 :(得分:0)

  

但是如果我想将row [0]的内容转换为字符串或char *,该怎么办?

使用mysql_fetch_lengths确定MYSQL_ROW中数组的长度。由于该行中有1列或更多列,因此可以有1列或更多长度。

根据27.8.5 C API Data Structures文档:

  

MYSQL_ROW

     

这是一行数据的类型安全表示。目前是   实现为计数字节字符串的数组。 (你不能   如果字段值可能包含二进制,则将它们作为以空字符结尾的字符串   数据,因为此类值内部可能包含空字节。)   通过调用mysql_fetch_row()获得。

然后,mysql_fetch_row文档给出了以下示例:

MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;

num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
   unsigned long *lengths;
   lengths = mysql_fetch_lengths(result);
   for(i = 0; i < num_fields; i++)
   {
       printf("[%.*s] ", (int) lengths[i],
              row[i] ? row[i] : "NULL");
   }
   printf("\n");
}

这里是一个使用它对表中的行进行计数的示例。该表是从FTC的Do No Call violations填充的。

MYSQL_RES* res = NULL;
MYSQL row;

const char SELECT_STMT[] = "SELECT COUNT(*) FROM blacklist_ftc";
if (mysql_query(mysql, SELECT_STMT) != 0)
{
    /* handle error */
    goto finish;
}

if ((res = mysql_store_result(s_mysql)) == NULL)
{
    /* handle error */
    goto finish;
}

if (mysql_num_fields(res) != 1 || mysql_num_rows(res) != 1)
{
    /* handle error */
    goto finish;
}

char buf[32];
unsigned long* length;

row = mysql_fetch_row(res);
length = mysql_fetch_lengths(res);

if (row == NULL || length == NULL)
{
    /* handle error */
    goto finish;
}

size_t size = length[0] < sizeof(buf)-1 ? length[0] : sizeof(buf)-1;
memcpy(buf, row[0], size);
buf[size] = '\0';

unsigned long count = (unsigned long)atoi(buf);

finish:

if (res)
{
    mysql_free_result(res);
    res = NULL;
}