使用 MYSQL C API 查询结果时。结果作为MYSQL_ROW
类型返回,根据 MYSQL C API 文档,我可以轻松地printf("%s", row[0])
. 但是,如果我想将 的内容传输row[0]
到字符串或 char* 中怎么办?
Steve
问问题
3461 次
3 回答
1
%s 格式应该只接受 char* 所以从你的描述看起来 MYSQL_ROW 真的是一个 char** 并且采用 row[0] 无论如何都会产生一个 char* 。
我看不出使用 sprintf()(或更安全但非标准的 asprintf())会有什么好处,但如果它能让你感觉更好,你可以考虑一下。
于 2008-11-08T22:43:51.267 回答
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 回答