我正在处理遗留项目并发现了一个问题。该代码正在从 sqlite 数据库中读取。它执行查询并遍历语句,然后为每一列获取列名和列值。
要获取值,它会调用 sqlite3_column_type。然后它检查类型并使用 sqlite3_column_int、sqlite3_column_double、sqlite3_column_text 等读取值。
问题是数据库中有一行包含 STRING 列,但该值仅包含数字(该值被设置为 12 个字符长,类似于 @"123456789012")。为该行调用 sqlite3_column_type 返回 SQLITE_INTEGER 因为它只查看列的值而不是声明的列类型。这意味着代码随后将使用 sqlite3_column_int 读取值,我将以整数溢出和一个与数据库中包含的原始值完全不同的数字结束。
这是一个简单的例子:
int columnType = sqlite3_column_type(statement, index);
if (columnType == SQLITE_INTEGER) {
//use sqlite3_column_int(statement, index)
}
else if (columnType == SQLITE_FLOAT) {
//use sqlite3_column_double(statement, index)
}
else if (columnType == SQLITE_TEXT) {
//use sqlite3_column_text(statement, index)
}
///etc...
如何确保从仅包含数字的 STRING 列中得到的值得到正确处理?我可以以某种方式检查声明的列类型(除了查询和解析原始创建表 sql 之外)吗?有更好的方法吗?
最佳答案
使用 column_decltype 而不是 column_type 意味着我得到声明的列类型 (STRING) 而不是值的类型。然后我可以将结果与 STRING、TEXT 等进行比较,以确定如何读取该值。
关于ios - 调用 sqlite3_column_type 返回 SQLITE_INTEGER 用于仅包含导致整数溢出的数字的 STRING 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38113129/