mysql_real_escape_string包括输出中的斜杠(C,而不是PHP)

时间:2014-12-22 18:17:33

标签: mysql c

我已多次看到有关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。它们使用相同的函数来转义二进制数据(从图像中),插入它,然后从数据库中获取相同的图像。我的二进制数据与图像的二进制数据有所不同对我没有意义。

1 个答案:

答案 0 :(得分:0)

如果您要插入BLOB列,那么您应该将其表示为HEX字符串,而不是通过mysql_real_escape_string()转义数据。你必须弄清楚如何将你的int16_t数据编码成所需的字节序列,因为至少你有一个字节顺序的问题需要整理(但如果你控制了编码和解码,那么你只需要让它们匹配)。

或者,如果数据是真正的文本而不是二进制,那么列的类型应该是Text而不是BLOB。在这种情况下,您应该继续使用普通的SQL字符串mysql_real_escape_string()