对于NULL值

时间:2017-03-16 21:07:48

标签: c++ mysql sql database

我们正在尝试从文件中获取数据并将其插入到具有此表格格式的mysql表中。然后检索数据并将其重新放回原始文件中的数据格式。这就是我们创建表格的方式。

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;

1 个答案:

答案 0 :(得分:1)

对于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指针表示。

正如您所看到的,问题是这是ac库,c ++中的NULL被定义为0 * ,这就是为什么你得到{{ 1}}表示数据库中的0值。

解决这个问题的唯一方法是使用列类型的知识来确定它是NULL整数)还是0值,但对于{ {1}}你无法知道它的整数值。

如果可以,请使用预准备语句并测试NULL结构的NULL成员,或者用c编写整个内容,因为这是一个c库。

* 我认为这就是新标准创建is_null的原因。