gpt4 book ai didi

mysql - 从 C 语言将 16 位整数数组插入 MySQL

转载 作者:行者123 更新时间:2023-11-29 12:30:37 25 4
gpt4 key购买 nike

我有一个很大的 int16_t 数组,需要将其放入 MySQL 数据库中。我通过将值复制到 char 缓冲区构建了一个查询字符串,但最终它不起作用(char 是 1 个字节,int16_t 是两个字节。)我在网上找到的有关将数组插入 MySQL 的文档是这样做的使用字符数组。

如何将这个 int16_t 数组插入 MySQL 数据库?

最佳答案

我认为你应该看看 BLOB 数据类型。它可以将二进制数据 block 存储到列中。有 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字符了。如果你读回来,数据又是“纯净的”。

一个非常简约的例子。假设我只想向表中写入一个 0x5c:

我不能写:插入 Ints(Id, Data) 值 (1, '\') 因为 MySQL 会认为我在\之后转义了 '。 (记住“\”是 0x5c)

所以我转义\: 插入 Ints(Id, Data) 值 (1, '\\')。当MySQL收到这个查询时,它只插入一个\。

表中仅插入一个字符。当读回时,它只产生一个字符。

关于mysql - 从 C 语言将 16 位整数数组插入 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27595995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com