sqlite 数据类型与 C# 类型的对应参考

2022年10月22日 | [sqlite] csharp


sqlite 中的类型

存储类型(Storage Classes),在 sqlite 中一个值的类型与值本身相关,并不与所在“容器”相关。

存储类型 说明
NULL NULL值
INTEGER 一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL 一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT 一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。
BLOB 一个 blob 数据,完全根据它的输入存储。

亲和类型(Type Affinity) 为了最大化保证 SQLite与其他数据库的兼容性,SQLite 可以使用其他关系数据库的类型,如下所示:

CREATE TABLE t1(a INT, b VARCHAR(10));
INSERT INTO t1(a,b) VALUES('123',456);

SQLite 在列上支持“类型亲和”的概念,列的亲和类型是该列数据的推荐类型。这里的重要思想是该类型是推荐的,而不是必需的。列仍然可以存储任何类型的数据。 只是对于某些列,会更喜欢使用一个存储类而不是另一个。 列的首选存储类称为“亲和类型”。 下表显示了当你指定某些类型时候,列对应的亲和类型:

C#类型 sqlite类型,创建表时可指定的类型 亲和类型/Type Affinity(存储类型)
Int32
Int64
INT
INTEGER
TINYINT
SMALLINT
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT2
INT8
INTEGER
String CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
TEXT
Binary BLOB
未指定类型
BLOB
Double
Float
REAL
DOUBLE
DOUBLE PRECISION
FLOAT
REAL
DateTime
Boolean
NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIME
NUMERIC

官方文档 Microsoft.Data.Sqlite 文档

C# 中的非托管类型 unmanaged type

2022年10月16日 | [csharp]


从 C# 7.3 开始,可使用 unmanaged 约束指定:类型参数为“非指针、不可为 null 的非托管类型”。

从 C# 8.0 开始,仅包含非托管类型的字段的 构造 结构类型也是非托管类型。


public struct Coords<T> where T : unmanaged
{
    public T X;
    public T Y;
}

非托管类型包括:

  1. sbytebyteshortushortintuintlongulongcharfloatdoubledecimal 或 bool
  2. 任何枚举类型
  3. 任何指针类型
  4. 任何用户定义的只包含非托管类型成员的 struct 类型。

C# 所有值类型都是在栈(Stack)中的吗?

2022年10月16日 | [csharp]


根据 Nick Chapsas 视频的演示,并不是所有 值类型都是在 Stack中的,下面表格显示在各种情况下 值类型所在的位置

在方法内声明的值类型
在方法参数中声明的值类型
声明为类成员的值类型
声明为结构成员的值类型 其所在结构的位置
ref struct 值类型 只能在栈中

image