我已多次看到有关PHP的问题(here is an example)。答案通常是停止使用魔术引号'。我在C中遇到这个问题。当我将二进制数据插入我的MySQL数据库中的BLOB时,通过mysql_real_escape_string()
运行它,一些5c(' \')字符出现在blob中。这会中断数据并使其无法使用。我该如何预防/解决这个问题?
#define CHUNK_SZ (1024*256)
void insertdb(int16_t *data, size_t size, size_t nmemb)
{
static int16_t *buf;
static unsigned long index;
static short initialized;
unsigned long i;
struct tm *info;
time_t rawtime;
char dbuf[12];
char tbuf[12];
char *chunk;
if(initialized==0){
buf = (int16_t *) malloc(CHUNK_SZ);
initialized = 1;
}
if(index + (nmemb*size) + 1 >= CHUNK_SZ || do_exit == 1){
time(&rawtime);
info = localtime(&rawtime);
snprintf(dbuf, 16, "%d-%02d-%02d", 1900+info->tm_year, 1+info->tm_mon, info->tm_mday);
snprintf(tbuf, 16, "%02d:%02d:%02d", info->tm_hour, info->tm_min, info->tm_sec);
chunk = (char *) malloc(index*2+1);
mysql_real_escape_string(con, chunk, (char *) buf, index);
char *st = "INSERT INTO %s (date, time, tag, data) VALUES ('%s', '%s', %d, '%s')";
int len = strlen(st)+strlen(db_mon_table)+strlen(dbuf)+strlen(tbuf)+sizeof(tag)+index*2+1;
char *query = (char *) malloc(len);
int qlen = snprintf(query, len, st, our_table, dbuf, tbuf, tag, chunk);
if(mysql_real_query(con, query, qlen)){
fprintf(stderr, "%s\n", mysql_error(con));
mysql_close(con);
exit(1);
}
free(chunk);
index = 0;
} else {
memcpy((void *) buf+index, (void *) data, nmemb*size);
index += (nmemb*size);
}
return;
}
编辑:请查看here。它们使用相同的函数来转义二进制数据(从图像中),插入它,然后从数据库中获取相同的图像。我的二进制数据与图像的二进制数据有所不同对我没有意义。
答案 0 :(得分:0)
如果您要插入BLOB列,那么您应该将其表示为HEX字符串,而不是通过mysql_real_escape_string()
转义数据。你必须弄清楚如何将你的int16_t
数据编码成所需的字节序列,因为至少你有一个字节顺序的问题需要整理(但如果你控制了编码和解码,那么你只需要让它们匹配)。
或者,如果数据是真正的文本而不是二进制,那么列的类型应该是Text
而不是BLOB
。在这种情况下,您应该继续使用普通的SQL字符串mysql_real_escape_string()
。