Если вы хотите сохранить uint64_t в базе данных sqlite и по-прежнему разрешать использовать его как uint64_t в SQL, то вам, вероятно, потребуется написать некоторые пользовательские функции.
Вам просто нужнопреобразовать 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_collation аналогичным образом.
Это не идеальное решение, поскольку вам нужно будет написать пользовательскую функцию для каждой операции, которую вы хотите выполнить, но она должна по крайней мере работать.