繁体   English   中英

从C向MySQL插入一个16位int数组

[英]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种不同的口味。 看下面的示例,其中图像存储在数据库中:

http://zetcode.com/db/mysqlc/

真正有趣的部分是页面的大约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字符。 如果您将其读回,则数据将再次为“纯”数据。

一个非常简约的例子。 假设我只想向一个表写入一个0x​​5c:

我不能写: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM