sqlite3列类型

我正在开始一个必须将数据从XML转换为db的新项目。 XMLs具有自己的格式,不能用于填充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. *是否有一项function可以始终检查插入的值是否格式正确? *

SQLite使用动态类型 。

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

 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)) );