sqlite3 列类型

标签 sql c sqlite embedded

我正在开始一个新项目,该项目必须将数据从 XML 转换为 dbXML 有自己的格式,不能用于填充 db

我选择使用sqlite,因为它是一个嵌入式平台,我需要一个轻量级的库。

我正在努力处理列类型。 我写了下面的sql:

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
   int i;
   for(i=0; i<argc; i++){
      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
   }
   printf("\n");
   return 0;
}

static bool exec_sql (sqlite3 *db, char *sql, bool use_callback)
{
    int rc;
    char *zErrMsg = 0;

    // Execute SQL statement
    if (use_callback == true)
    {
        rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    }
    else
    {
        rc = sqlite3_exec(db, sql, NULL, 0, &zErrMsg);
    }

    if( rc != SQLITE_OK )
    {
        fprintf(stderr, "SQL: %s FAIL!!!\nError: %s\n", sql, zErrMsg);
        sqlite3_free(zErrMsg);
        return false;
    }
    return true;
}

int main ( int argc, char *argv[] )
{
    xmlDoc *doc;
    xmlNode *root_element;
    FILE *fw;
    int i, srcidx, next_start;

    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    char *sql;

    rc = sqlite3_open("Configuration.db", &db);

    if( rc )
    {
        XML2DB_DEBUG_ERR("Can't open database: %s\n", sqlite3_errmsg(db));

    }
    else
    {
        XML2DB_DEBUG_INFO("Opened database successfully\n");
    }

    sql = "CREATE TABLE Table2("  \
         "ID          INT      NOT NULL PRIMARY KEY," \
         "TABLE_1_ID  INT      FOREGN KEY REFERENCES Table1(ID) NOT NULL ," \ 
         "COLUMN_1    INT[512] NOT NULL,"\
         "COLUMN_2    TEXT     NOT NULL,"\
         "COLUMN_3    BOOLEAN  DEFAULT FALSE);";

    // Execute SQL statement
    exec_sql(db, sql, false);

    sql = "INSERT INTO Models (ID, TABLE_1_ID, COLUMN_1, COLUMN_2, COLUMN_3) "\
          "VALUES (1, 1, '{1,2,3,4,5}', 'blabla', TRUE); ";

    // Execute SQL statement
    exec_sql(db, sql,true);

    sql = "SELECT * FROM Table2;";

    // Execute SQL statement
    exec_sql(db, sql, true);

    sqlite3_close(db);

    return 0;
}

该代码运行良好,但现在我发现 sqlite3 不支持 booleanarray 数据类型。

我写道,“它运行良好”,因为 SELECTDBVisualizer 可以显示数据并且不会给我错误。

所以,问题是:

  1. 为什么即使不支持数据类型且插入的值不正确,sql 也能执行良好?
  2. *是否有一项功能可以启用以始终检查插入值的格式是否正确? *

最佳答案

SQLite 使用 dynamic typing .

要检查数据类型,请使用 CHECK constraints :

CREATE TABLE Table2(
    ID          INTEGER  PRIMARY KEY,
    TABLE_1_ID  INT      FOREIGN KEY REFERENCES Table1(ID) NOT NULL,
    COLUMN_1    INT[512] NOT NULL
    COLUMN_2    TEXT     NOT NULL   CHECK (typeof(COLUMN_2) = 'text'),
    COLUMN_3    BOOLEAN  DEFAULT 0  CHECK (COLUMN_3 IN (0, 1))
);

关于sqlite3 列类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32698022/

相关文章:

c - 将 mmap 与 PROT_NONE 与 PROT_READ 结合使用之间是否存在性能差异?保护写入

python-3.x - sqlite3 python3,数据库的用户输入

java - android中识别第二次点击事件

sql - 加速大表和小表之间的内连接

mysql - 如何避免连接中同一行的两个结果

c# - 有什么方法可以使此查询更快并在循环外构建 where 子句吗?

c - 仅对共享库使用 Electric Fence (libefence)

php - 使用 LIMIT 选择左连接

c - 将 unsigned char * 转换为 int 的最佳方法?

javascript - 如何使用 sql.js 创建 someFileName.sqlite 数据库,无需 NodeJs 和 Coffeescript,而仅使用 Javascript 并使用它?