【问题标题】:SQLite data typesSQLite 数据类型
【发布时间】:2010-08-02 13:13:59
【问题描述】:

我通过Zentus 在Java 应用程序中使用SQLite。在这种情况下,我需要在我的数据库中保存和查询 Java long 值。来自其他 RDBMS,我创建了如下表来存储长值:

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue LONG)

此解决方案会产生异常行为,但在阅读 SQLite documentation on data types 后,我了解到我的 LONG 类型与使用 TEXT 具有相同的效果 => longValue 存储为文本。

然后我决定将其更改为INTEGER(它的长度是可变的,最多可以存储 64 位整数,这是 Java 的长度),以便获得更简洁的代码,并且可能是为了节省一些磁盘空间并提高性能,因为我的 longValues 被插入并查询为long

比较所创建数据库的性能和大小后,我看不出两者之间有任何区别:

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue LONG)

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue INTEGER)

对这个主题有什么经验、经验或感受吗?

【问题讨论】:

    标签: java sqlite


    【解决方案1】:

    在 SQLite 中,数据类型是按值而非按列的。因此,当您插入整数时,无论列类型如何,它们都以整数形式存储。

    【讨论】:

    • 列有“亲和力”;例如,传递数字字符串的文本列应将其存储为文本,保留格式(小数位等)。而传递数字字符串的数字列将在存储之前将其转换为数字,因此“10.00”稍后将返回为“10”。由于 LONG 列具有默认的数字亲和性,因此将类型更改为 INTEGER 不会改变任何内容。
    • SQlite 网站的回答是:“为了最大化 SQLite 和其他数据库引擎的兼容性,SQLite 支持列上的“类型亲和性”的概念。推荐使用列的类型亲和性存储在该列中的数据的类型。这里的重要思想是该类型是推荐的,而不是必需的。任何列仍然可以存储任何类型的数据。只是某些列,如果可以选择,会更喜欢使用一个存储类胜过另一个”但是“将更喜欢”是什么意思?对性能和数据库大小有影响吗?
    • @Tangent,非常感谢您的帮助。还有一个问题,我在想具有 TEXT 亲和力的 LONG 列。您从哪里获得对 LONG 列的亲和力,在 Web 文档中,或者是否可以将它请求到 sqlite?
    • SQLite 无法识别 LONG,但数据类型文档中的第 2.1 节说无法识别的类型默认为数字。
    • @Pacerier 是的。如果数据无法转换,则将按原样存储。比如“apple”或者1.5,当插入整数列时,会不被转换,而1.0会被转换成整数1。BLOB和NULL是唯一不能转换成字符串的东西,所以会出现这种现象对于文本列不太明显。
    【解决方案2】:

    SQLite 会自动选择正确的大小。来自http://www.sqlite.org/datatype3.html

    整数。该值是一个有符号整数,以 1、2、3、4、6 或 8 个字节存储 取决于价值的大小。

    SQLite 使用动态类型并且是无模式的。

    【讨论】:

    • 感谢克里斯蒂安的快速回答。我已经读过了,这就是为什么我认为使用 INTEGER 的数据库大小将小于使用 LONG 的数据库大小,因为在“文本”(我认为是 utf8)中编码 long 应该比使用可变长度整数更昂贵。不是吗?如何解释 2 个数据库的大小相同?
    • 当然不是 NoSQL 数据库(键/值)系统意义上的“无模式”。我提供的第一个链接和sqlite.org/different.html 更详细地解释了打字。
    【解决方案3】:

    看了性能和尺寸之后 我无法创建的数据库 看看有什么区别:

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

    使用 INTEGER 亲和性的列 行为与具有相同的列 NUMERIC 亲和力。区别 INTEGER 和 NUMERIC 亲和性之间的关系 仅在 CAST 表达式中明显。

    【讨论】:

    • 您的意思是在强制转换中,数字的操作类似于“浮点”类型吗?
    【解决方案4】:
    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)
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 2011-01-27
      • 1970-01-01
      • 2023-03-09
      相关资源
      最近更新 更多