2017-03-16 173 views
1

我们试图从文件中获取数据并将其插入到具有此表格格式的mysql表中。然后稍后检索数据并将其恢复为与原始文件中的数据相同的格式。这是我们如何创建表格。MySQL C API为NULL值返回零而不是NULL

create_query = "CREATE TABLE IF NOT EXISTS "; 
string date = "20170223"; 
string table_format = " (IDpk INT NOT NULL auto_increment," 
         " symbol CHAR(8) NOT NULL," 
         " number_1 BIGINT unsigned DEFAULT NULL," 
         " number_2 BIGINT unsigned NOT NULL," 
         " PRIMARY KEY(IDpk))"; 

这就是我们如何创建插入数据库的字符串。

uint32_t item_type = stoi(tokens[2]); 
     query = insert_query; 

     switch(item_type) 
     { 
     case 0: //bid 
     case 1: //ask 
     {   "###,%s,%s," 
        "NULL," 
        "%s,%s", 
        tokens[0], tokens[1], tokens[2]); 
      break; 
     } 

然后我们将数据传递给这个函数,我们将数据插入表中。

void read_in_data(string date, string file, MYSQL* conn) 
{ 
string query = "LOAD DATA INFILE " + file + 
       "INTO TABLE " + date + 
       "FIELDS TERMINATED BY ','" 
       "LINE STARTING BY '###'"; 

mysql_query(conn, query.c_str()); 
} 

当我们试图从数据库中取回数据并将其重新格式化为原始输入文件时,会出现此问题。我们注意到我们的NULL值由0表示而不是NULL。我们很好奇如何插入它们以使它们为NULL而不是0.这是我们目前的提取方法。

ofstream out_file; 
out_file.open("test.txt", fstream::in); 
if(out_file.good()) 
{ 
    res = mysql_store_result(conn); 
    int num_fields = mysql_num_fields(res); 
    while((row = mysql_fetch_row(res))) 
    { 
    unsigned long * lengths; 
    lengths = mysql_fetch_lengths(res); 
    for(int i = 0; i < num_fields; i++) 
    { 
     if(row[i]) 
     { 
     out_file << row[i] << " "; 
     } 
    } 
    out_file << endl; 
    } 
}else 
cout << strerror(errno) << endl; 

回答

0

对于NULL值,则需要从检查的结果is_null,相信MYSQL_BIND结构。

由于你的情况,你正在使用mysql_fetch_row()I recommend reading this

值的行数由mysql_num_fields(result)给出。如果row将呼叫的返回值保存为mysql_fetch_row(),则指向该值的指针将被访问为row[0]row[mysql_num_fields(result)-1]NULL行中的值由NULL指针指示。

正如你所看到的,问题是,这是一个C库,并在C NULL ++定义为0*,所以这就是为什么你得到0在数据库中的NULL值。

解决这个问题的唯一办法,就是用列类型的知识,以确定它是否是一个0整数)或NULL值,但对于NULL整数值,你没有办法知道。

如果可以,请使用准备好的语句并测试MYSQL_BIND结构的is_null成员,或者将整个事件写入c中,因为这是一个c库。


*我想这就是为什么新标准建立的nullptr

+0

我们在代码中没有使用mysql_stmt_bind_result()或mysql_stmt_fetch(),所以有什么方法可以在我们当前正在使用的循环中测试NULL,还是必须以这种方式绑定结构?我们试图从文档中做到这一点:https://dev.mysql.com/doc/refman/5.7/en/mysql-fetch-row.html –

+0

@ShakeyJay你看,我讨厌C++的主要原因是因为这自然是不可读的。你的代码中的任何地方是否有'row'的定义/声明? –

+0

对不起,不包括它,但这是声明:MYSQL * conn = mysql_init(nullptr); MYSQL_RES * res = nullptr; MYSQL_ROW row = nullptr; –