2

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

4

3 回答 3

1

%s 格式应该只接受 char* 所以从你的描述看起来 MYSQL_ROW 真的是一个 char** 并且采用 row[0] 无论如何都会产生一个 char* 。

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

于 2008-11-08T22:43:51.267 回答
0

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

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

于 2008-11-08T22:43:40.157 回答
0

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

用于mysql_fetch_lengths确定MYSQL_ROW. 因为行中有 1 个或多个列,所以可以有 1 个或多个长度。

根据27.8.5 C API 数据结构文档:

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 的“禁止致电违规”填充的。

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;
}
于 2019-03-02T20:35:04.970 回答