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] 到字符串类型?的主要内容,如果未能解决你的问题,请参考以下文章
查询Mysql表之后将结果转换为json时如何能够保持字段的原有数据类型?
解决Data too long for column ‘xxx‘ at row 1问题以及深入理解mysql的字符串数据类型(char,varchar,enum,text,longtext...)