[英]Inserting an array of 16-bit ints to MySQL, from C
我需要将大量的int16_t放入MySQL数据库。 我通过将值复制到char缓冲区来构造查询字符串,但最后它不起作用(char为1字节,int16_t为2字节。)我在网上找到的有关将数组插入MySQL的文档可以这样做。与字符数组。
如何将此int16_t数组插入MySQL数据库?
我认为您应该查看BLOB数据类型。 可以将二进制数据块存储到列中。 根据您所需的大小,有4种不同的口味。 看下面的示例,其中图像存储在数据库中:
真正有趣的部分是页面的大约80%,该页面用于存储图像,然后从数据库中检索图像。 请特别注意mysql_real_escape_string()函数,该函数可确保数据对于实际查询是合法的。 您应该能够立即发送int16数组。
编辑...这是有效的“保存”路由。 它将ints数组作为二进制blob保存到数据库中。 该程序不完整。 例如。 它没有连接到数据库,
#define SIZE 20000
int16_t ints[SIZE];
MYSQL *con;
int
ints_saved(void) // Returns 0 if there's an error
{
char *chunk, *st, *query;
size_t ints_size = sizeof(ints),
st_len;
int qlen;
chunk = (char *)malloc(ints_size*2 + 1);
// template for creating SQL
st = "insert into Ints(Id, Data) values(1, '%s')";
st_len = strlen(st);
// Remove dangerous characters
mysql_real_escape_string(con, chunk, (char *)ints, ints_size);
query = (char *)malloc(st_len + 2*ints_size+1);
// Construct the actual query here
qlen = snprintf(query, st_len + 2*ints_size+1, st, chunk);
printf("%s\n", query);
// Execute the query
if (mysql_real_query(con, query, qlen)) {
printf("%s\n", mysql_error(con));
return(0);
};
return(1);
}
请注意,数据库表由两列Id(int)和Data(blob)定义。 如果您还有其他尺寸要求,则可能必须修改Blob。
警告:还没有人大喊大叫,但请注意该系统在不同的编译器中可能产生不同的结果。 一些编译器可能会将16位整数与4字节边界对齐。 因此,尽管我已使用sizeof()函数将其考虑在内,但实际保存的记录可能会在某些计算机上占用更多空间。 如果要避免该问题,可以使用“打包”记录来避免这种情况-请参阅编译器的文档。
写入过程:int16_t位于数组中。 如果将其视为整数,则会得到:
17767 9158 -26519 18547 -9135 23807 -27574 22764 7977 31949 22714 -10325 16882 7931 -22045 -7866 124 25282 2132 10232 8987 -5656 -12825 17293
查看与字节(或字符)相同的数组,我看到:
67 45 C6 23 69 98 73 48 51 DC FF 5C 4A 94 EC 58 29 1F CD 7C BA 58 AB D7
(67 45是第一个int值17767)
我不能这样写,因为字节11是0x5C,这混淆了查询字符串:
67 45 C6 23 69 98 73 48 51 DC FF 5C 4A 94 EC 58 29 1F CD 7C BA 58 AB D7
^^
因此,我调用mysql_escape函数,并使用结果构成查询:
67 45 c6 23 69 98 73 48 51 dc ff 5c 5c 4a 94 ec 58 29 1f cd 7c ba 58 ab
^^^^^
注意额外的0x5c吗?
当我执行查询时,我将转义的字符串发送给MySQL,MySQL 立即删除转义并将UN-ESCAPED字符串写入数据库。 因此,从现在开始,不再有多余的0x5c字符。 如果您将其读回,则数据将再次为“纯”数据。
一个非常简约的例子。 假设我只想向一个表写入一个0x5c:
我不能写: insert into Ints(Id, Data) values (1, '\\')
因为MySQL会认为我在\\之后转义了'。 (请记住,“ \\”是0x5c)
所以我逃避了\\: insert into Ints(Id, Data) values (1, '\\\\')
。 当MySQL收到此查询时,尽管它只插入一个 \\。
在表中仅插入一个字符。 当回读时,它仅产生一个字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.