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。
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。