SQLiteConnection 读取 SMALLINT 溢出

SQLiteConnection read SMALLINT overflow

I read sqlite document datetype 表示 SMALLINT 是亲和力整数。

我使用下面的库。
https://www.nuget.org/packages/System.Data.SQLite.Core/1.0.113.1

常用函数

private static void TestSqlite(IDbConnection conn, string sql, Action<SQLiteCommand> action)
{
    conn.Open();
    var cmd = conn.CreateCommand();
    cmd.CommandText = sql;
    action?.Invoke(cmd);
    conn.Close();
}

(1) 我创建了 TESTOVERFLOW table.

var cache = "Cache.db";
var conn = new SQLiteConnection($"Data Source={cache};Version=3;");
var sql1 = "CREATE TABLE IF NOT EXISTS TESTOVERFLOW(ID INTEGER PRIMARY KEY AUTOINCREMENT, SHOWSMALLINT SMALLINT NOT NULL)";
TestSqlite(conn, sql1, (cmd) => cmd.ExecuteNonQuery());
    

(2) 我将名称为 SHOWSMALLINT 的值 65535 插入到 TESTOVERFLOW table.

var sql2 = "INSERT INTO TESTOVERFLOW(SHOWSMALLINT) VALUES (65535)";
TestSqlite(conn, sql2, (cmd) => cmd.ExecuteNonQuery());

(3) 阅读 TESTOVERFLOW table 和 select 列 SHOWSMALLINT。我得到值 -1.

var sql3 = "SELECT * FROM TESTOVERFLOW";
TestSqlite(conn, sql3, (cmd) =>
{
    var reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        Console.WriteLine($"{reader[0]} | {reader[1]}");
        // 1 | -1
    }
});

(3.1) 使用sqlite3 命令读取TESTOVERFLOW table 得到SHOWSMALLINT 值为65535 见下图

(4) 为什么我用C# SQLiteconnection读取的值是-1而不是65535?
二进制的 65535 和 -1 低于

1111 1111 1111 1111(2)(unsign) => 65535(10)
1111 1111 1111 1111(2)(sign)   =>    -1(10)

SMALLINT 是关联整数。所以我认为读取值必须是 65535 因为我插入值 65535 是正确的没有显示错误。

我使用 sqlite 命令读取值是 65535 但我使用 Sqliteconnection 似乎将值转换为 -1。

SQLiteConnection读取的数据类型是不是遵循sqlite文档类型?

最后我为 SQLiteConnection 编写了测试项目。
测试System.Data.SQLite.Core库,使用IDataReader读取值并在下面列出sqlite数据类型。

Range is 0 ~ 255, 0 ~ (2^8 -1)
TINYINT

Range is -32768 ~ 32767, (-2^15) ~ (2^15 -1)
SMALLINT

Range is -2147483648 ~ 2147483647, (-2^31) ~ (2^31 -1)
INT
MEDIUMINT

Range is over than -9223372036854775808 ~ 9223372036854775807, (-2^63) ~ (2^63 -1) that will cast to the exponent value
INTEGER
INT2
INT8
BIGINT
UNSIGNED BIG INT

如果您对结果感兴趣,可以参考test project