C++ MySQL C API对空值返回零而不是空
我们正试图从一个文件中获取数据,并将其插入具有此表格式的mysql表中。然后检索数据并将其恢复为原始文件中的数据格式。这就是我们创建表的方式C++ MySQL C API对空值返回零而不是空,c++,mysql,sql,database,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
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;
流输出文件的;
out_file.open(“test.txt”,fstream::in);
if(out_file.good())
{
res=mysql存储结果(conn);
int num_fields=mysql_num_fields(res);
while((row=mysql\u fetch\u row(res)))
{
无符号长*长度;
长度=mysql_fetch_长度(res);
对于(int i=0;i out\u file对于NULL
值,您需要从结果中检查是否为NULL
,我相信是MYSQL\u BIND
结构
因为您使用的是mysql\u fetch\u row()
行中的值数由mysql\u num\u字段(结果)
给出。如果row
持有调用mysql\u fetch\u row()
的返回值,则指向值的指针将作为行[0]
访问行[mysql\u num\u字段(结果)-1]
NULL
行中的值由NULL
指针指示。
正如您所看到的,问题是这是一个C库,C++中的Nult 被定义为<代码> 0 //>代码>,这就是为什么您在数据库中获得<代码> null <代码>值的<代码> 0 <代码>。
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;
}
唯一的解决方法是使用列类型的知识来确定它是0
(整数)还是NULL
值,但是对于NULL
整数值,您无法知道它
如果可以的话,可以使用预先准备好的语句并测试MYSQL\u BIND
结构的is\u null
成员,或者用c编写整个过程,因为这是一个c库
*我认为这就是为什么较新的标准创建了nullptr
我们没有使用mysql\u stmt\u bind\u result()或mysql\u stmt\u fetch()在我们的代码中,有没有一种方法来测试我们当前使用的循环中的null,或者必须这样绑定结构吗?我们试图从DOCS中做到这一点:@ ShakeyJay,你看,我讨厌C++的主要原因是因为它自然是不可读的。代码中的任何地方的定义/声明<代码>行>代码>是吗?很抱歉没有包括它,但这是声明:MYSQL*conn=MYSQL_init(nullptr)MySqLyReSRes=null pTr.MySqLyLROWROW=null pTrr;@ ShakeyJay我得到了一个答案,我认为这次会令人满意。问题是,它不是C++库。抱歉,你似乎把你的C++弄得一团糟。你关于 null /Cuth>的想法就是不这样做。在C++中,<代码> 0 /代码>作为一个积分常量表达式。可以将上的转换为空指针。这仅在该方向上,并且仅在编译时。运行时空指针值不会转换为0。