SQLite数据类型

19

我正在通过Zentus在Java应用程序中使用SQLite。在这种情况下,我需要将Java的long值保存并查询到我的数据库中。由于来自其他关系型数据库管理系统,我创建了以下表格来存储长整型值:

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue LONG)

这个解决方案产生了期望的行为,但是在阅读SQLite数据类型文档后,我了解到我的LONG类型与使用TEXT相同=> longValue存储为文本。

然后我决定将其更改为INTEGER(长度可变,可以存储长达64位整数,这是Java long的长度),以便拥有更清晰的代码,并且可以节省一些磁盘空间并提高性能,因为我的longValues被插入和查询为long

比较性能和创建的数据库大小后,我无法看到任何区别:

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue LONG)

并且

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue INTEGER)

对这个主题有任何评论、经验或感受吗?

4个回答

25
在SQLite中,数据类型是按值而不是按列进行的。因此,当您插入整数时,它们将以整数形式存储,而不管列类型如何。

11
列具有“亲和性”;例如,传递数字字符串的文本列应将其存储为文本,保留格式(小数位等)。而对于传递数字字符串的数字列,在存储之前会将其转换为数字,因此“10.00”稍后将仅返回“10”。由于LONG列具有默认的数字亲和性,将类型更改为INTEGER不会改变任何内容。 - Tangent 128
4
SQLite官网的回答是:“为了最大限度地提高SQLite与其他数据库引擎的兼容性,SQLite支持对列的“类型亲和性”的概念。列的类型亲和性是该列中存储数据的推荐类型。这里的重要思想是类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据。只是有些列在选择时更喜欢使用一种存储类而不是另一种。”但是,“会更喜欢”是什么意思?它会影响性能和数据库大小吗? - Manuel Selva
@Tangent,非常感谢您的帮助。还有一个问题,我在考虑具有TEXT亲和性的LONG列。您是从Web文档中获取了LONG列的亲和性吗?或者可以向sqlite询问吗? - Manuel Selva
5
SQLite不认识LONG数据类型,但在数据类型文档中的第2.1节中提到,未被识别的类型会默认为数字类型。 - Tangent 128
@Tangent128 如果我有一个“文本”亲和力的列,那么该列的任何行是否可能具有不是“文本”的值?同样,如果我有一个“整数”亲和力的列,那么该列的任何行是否可能具有不是“整数”的值? - Pacerier
1
@Pacerier 是的。如果数据无法转换,它将按原样存储。例如,插入整数列的“apple”或1.5将不被转换,而1.0将被转换为整数1。BLOB和NULL是唯一无法转换为字符串的内容,因此对于文本列,这种现象就不那么明显了。 - Tangent 128

8

SQLite会自动选择合适的大小。根据http://www.sqlite.org/datatype3.html

INTEGER。该值是有符号整数,存储在1、2、3、4、6或8字节中,具体取决于值的大小。

SQLite使用动态类型,没有模式限制。


谢谢你的快速回复,克里斯蒂安。我已经读过了,这就是为什么我认为使用INTEGER的数据库大小会比LONG小,因为在“文本”(我想应该是utf8)中编码长整数应该比使用可变长度整数更昂贵。对吗?我怎样能解释两个数据库大小相同的问题呢? - Manuel Selva
当然,"schema free"并不意味着NoSQL数据库(键/值系统)。我给出的第一个链接和http://www.sqlite.org/different.html更详细地解释了类型。 - Christian Ullenboom

7

在查看性能和创建的数据库大小后,我无法看到以下两者之间的任何区别:

没有任何区别。INTEGER具有整数亲和性,LONG具有数字亲和性。而且,http://www.sqlite.org/datatype3.html说:

使用INTEGER亲和性的列与使用NUMERIC亲和性的列表现相同。INTEGER和NUMERIC亲和性之间的差异仅在CAST表达式中显现。


你的意思是在类型转换中,数值类型会像“浮点数”一样操作吗? - Pacerier

2
CREATE TABLE ex2(
  a VARCHAR(10),
  b NVARCHAR(15),
  c TEXT,
  d INTEGER,
  e FLOAT,
  f BOOLEAN,
  g CLOB,
  h BLOB,
  i TIMESTAMP,
  j NUMERIC(10,5)
  k VARYING CHARACTER (24),
  l NATIONAL VARYING CHARACTER(16)
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接