MySQL C API对于NULL值返回零而不是NULL

1aaf6o9v  于 2023-04-19  发布在  Mysql
关注(0)|答案(2)|浏览(111)

我们试图从一个文件中获取数据并将其插入到一个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;
46scxncf

46scxncf1#

对于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库,而NULL在c++中被定义为0 *,所以这就是为什么你在数据库中得到NULL值的原因。
解决这个问题的唯一方法是使用列类型的知识来确定它是0integer)还是NULL值,但是对于NULL整数值,您无法知道它。
如果可以的话,使用一个准备好的语句并测试MYSQL_BIND结构的is_null成员,或者用c编写整个代码,因为这是一个c库。

  • 我认为这就是为什么新标准创建了nullptr
ymdaylpp

ymdaylpp2#

我通常是这样的

auto   lengths = mysql_fetch_lengths(result);

并检查

if (row[i] == nullptr && lengths[i] == 0)

因此您可以区分是字符串(长度为1)、空字符串(长度为)还是NULL(两者都为)
但是,是的,API是糟糕的,应该有一个更好的方法

相关问题