我正在使用sqlite.org上提供的sqlite3库。

我有一些我想存储在数据库中的无符号长型。我不想自己构造查询,而让它可以进行某种注入(inject)(无论是否偶然)。因此,我正在使用 sqlite_bind_* 函数“清理”我的参数。

问题在于,无符号长整数没有函数类型,只有整数。
int sqlite3_bind_int(sqlite3_stmt*, int, int);int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
如果我无法以无符号方式存储它们,我肯定会溢出数字。

我需要自己处理吗? (即从数据库中选择后转换为无符号类型,或在插入数据库之前转换为有符号类型)

如果我必须自己解决这个问题,那么当比较真正处于无符号范围内时,将如何做一些存储为有符号长整数的比较查询呢?

查看转换后的INTEGER datatypes,可能会认为无符号的long可以毫无问题地表示出来。

如果还有其他解决方案,请赐教!
谢谢!

最佳答案

如果您想将uint64_t存储在sqlite数据库中,并且仍然允许在SQL中将其用作uint64_t,那么您可能需要编写一些自定义函数。

您只需要在向数据库发送和从数据库发送时将uint64_t强制转换为int64_t,然后编写自定义函数即可执行所需的任何比较等。例如,要做一个大于比较:

void greaterThan( sqlite3_context* ctx, sqlite3_value** values )
{
    uint64_t value1 = boost::numeric_cast< uint64_t >( sqlite3_value_int64( value[ 0 ] ) );
    uint64_t value2 = boost::numeric_cast< uint64_t >( sqlite3_value_int64( value[ 1 ] ) );
    sqlite3_result_int( ctx, value1 > value2 );
}

//Register this function using sqlite3_create_function
sqlite3_create_function( db, "UINT_GT", 2, SQLITE3_ANY, NULL, &greaterThan, NULL, NULL );

然后在SQL中使用它:
SELECT something FROM aTable WHERE UINT_GT(value1,value2);

另外,如果您需要基于uint64_t的自定义排序规则,则应该能够以类似方式使用sqlite3_create_collat​​ion。

这不是一个完美的解决方案,因为您需要为要执行的每个操作编写一个自定义函数,但它至少应该可以工作。

关于c++ - 在sqlite3语句中绑定(bind) 'unsigned long'(uint64)? C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8496730/

10-13 06:51