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

Posted

技术标签:

【中文标题】MYSQL_ROW 和 row[0] 到字符串类型?【英文标题】:MYSQL_ROW and row[0] to string type? 【发布时间】:2008-11-08 22:34:03 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

任何形式的操作似乎都会给我一个运行时错误。将其转换为字符串、strcpy、sprintf 等等等 那么有人找到方法了吗?很难相信 API 只允许用户检索结果并将其打印出来,而不允许您将其存储在内存中。【参考方案2】:

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

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

【讨论】:

请注意,如果您这样做,它将停在第一个 \0【参考方案3】:

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

使用mysql_fetch_lengths 确定MYSQL_ROW 中数组的长度。因为行中有 1 个或更多列,所以可以有 1 个或多个长度。

根据27.8.5 C API Data Structures 文档:

MYSQL_ROW

这是一行数据的类型安全表示。目前是 实现为计数字节字符串的数组。 (你不能治疗 如果字段值可能包含二进制,则这些为以 null 结尾的字符串 数据,因为这样的值可能在内部包含空字节。)行是 通过调用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;

【讨论】:

以上是关于MYSQL_ROW 和 row[0] 到字符串类型?的主要内容,如果未能解决你的问题,请参考以下文章

datatables怎么转化string类型

详解php中空字符串和0之间的关系

查询Mysql表之后将结果转换为json时如何能够保持字段的原有数据类型?

学习 Python 之 数据类型

解决Data too long for column ‘xxx‘ at row 1问题以及深入理解mysql的字符串数据类型(char,varchar,enum,text,longtext...)

g2oEigenMat矩阵类型转换