use*_*141 6 c# sqlite unsigned-integer
使用System.Data.SQLite,我正在创建一个包含无符号整数列的表:
@"CREATE TABLE widgets (" +
@"id unsigned integer(10) PRIMARY KEY, " +
@"fkey unsigned integer(10), " + ...
Run Code Online (Sandbox Code Playgroud)
然后插入像这样的值
INSERT INTO widgets (id, fkey, ...) VALUES (4294967295, 3456, ...
Run Code Online (Sandbox Code Playgroud)
但是,循环遍历此表的行和列,我发现它row["id"]具有类型System.Int32(而不是UInt32),并且毫不奇怪,4294967295被解释为-1.实际上,表中的所有unsigned int字段(不仅主键id被错误地键入System.Int32)
同时,SQLite类型规范说整数存储在1,2,3,4,6或8个字节中,具体取决于值的大小.4294967295 = 0xFFFFFFFF只适合四个字节.它似乎与SQLite的所谓"动态类型"不一致.当我插入大于4294967295的正值时,类型仍然存在System.Int32.
这是一个错误还是一个功能?
PS1:
我的表包含1行,列id = 2 ^ 32-1 = 4294967295(或更大),我打印所有列的类型
public void PrintDataTypes(DataTable dt) {
foreach (DataRow row in dt.Rows) {
foreach (DataColumn col in dt.Columns)
Console.WriteLine("name={0}, type={1}",
col.ToString(),
row[col].GetType().ToString());
return; // after 1st row is done
}
}
Run Code Online (Sandbox Code Playgroud)
我总是得到
name=id, type=System.Int32
name=fkey, type=System.Int32
...
Run Code Online (Sandbox Code Playgroud)
即使您在 SQL 中指定了无符号,您也不会在 SqLite 中获得无符号整数列。是的,我个人认为这是一个明显的缺陷 - 它甚至不会在 SQL 中看到“未签名”规范时输出警告。因此,您的列是 64 位有符号的,并且您可以存储的最大值确实是 2 的 63 次方。
| 归档时间: |
|
| 查看次数: |
946 次 |
| 最近记录: |