【问题标题】:SQlite select returns "(null)" instead of "" for empty values对于空值,SQlite 选择返回“(null)”而不是“”
【发布时间】:2016-02-27 05:15:09
【问题描述】:

我在 Linux 中编写了一个 C 程序,它读取本地 Sqlite3 数据库以更新远程 MySQL 数据库。 当 Sqlite 表中的可选字段为空时,我在进行选择时得到字符串“(null)”。这以远程 MySQL 数据库中的大量“(null)”字符串结束。

Sqlite3中是否有任何标志或配置选项可以在表的字段为空时获取空字符串“”?

已编辑:

作为 CL。提到它是 snprintf 函数,在构建 sql_query 时,它为 NULL 值创建“(null)”字符串。那不是我想要的,所以我想我必须检查每个值以查看它是否为 NULL?有没有更好的办法?在这个例子中没关系,但在真实的例子中,有很多字段..

示例代码: 这是在sqlite select之后执行的回调函数,然后我用获取的数据构建一个sql查询来更新远程MySQL:

static int callback_sync_Table(void *NotUsed, int argc, char **argv, char **azColName){

int rc;
char *zErrMsg = NULL;
char sql_query[512];

memset(sql_query, '\0', sizeof(sql_query));
snprintf(sql_query, sizeof(sql_query)-1, "INSERT INTO table(field_1,field_2,field_3) VALUES("
         "\"%s\",\"%s\",\"%s\") ON DUPLICATE KEY UPDATE "
         "field_1=\"%s\",field_2=\"%s\",field_3=\"%s\";",
         argv[0], argv[1], argv[2],
         argv[0], argv[1], argv[2],);

if(mysql_query(mysql_db_conn, sql_query)){
    fprintf(stderr, "MySQL error: %s\n", mysql_error(mysql_db_conn));
    syslog(LOG_DEBUG, "MySQL error: %s", mysql_error(mysql_db_conn));
}
return 0;

}

【问题讨论】:

  • NULL 和空字符串 '' 不是一回事。如果您一开始就不想在数据库中出现空值,请将NOT NULL 约束添加到您的 SQLite 列,并且首先不要插入它们。
  • 数据库不会为 NULL 值生成字符串 (null)。但是,printf() 函数对 NULL 指针执行此操作。显示您的代码!
  • 对,你是对的,当然是snprintf,我瞎了!请参阅我的编辑。有没有比检查每个值是否为 NULL 更好的方法?

标签: mysql linux database sqlite


【解决方案1】:

以这种方式使用snprintf 编写SQL 查询是不好的,不仅因为空值,而且因为您没有转义字符串,您可能会遇到all kinds of trouble

我建议改用prepared statements API。当您使用它时,在 C 级别您必须根据给定值是否为 NULL 显式设置一些 is_bool 标志。

【讨论】:

  • 感谢 MvG,我不知道准备好的语句,它们真的很有用。我已经重新编写了代码,并且似乎工作得很好。现在我的代码更高效、更安全、更专业。谢谢!
  • 那么@japjap,你是怎么解决这个问题的?也许你需要在答案部分写解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 2010-12-24
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多