【问题标题】:Why columns with integer data type is also storing the float values in SQL data base为什么具有整数数据类型的列也在 SQL 数据库中存储浮点值
【发布时间】:2021-04-15 14:52:34
【问题描述】:

我用这个语句做了一个SQL数据库

final String SQL_CREATE_PRIMARY_TABLE = "CREATE TABLE " +
            TABLE_NAME + " (" +
            P_K + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            SET_NAME + " TEXT, " +
            MARKS_O1 + " INTEGER, " +
            MARKS_O2 + " INTEGER, " +
            MARKS_O3 + " INTEGER, " +
            MARKS_O4 + " INTEGER, " +
            ATTEMPTS + " INTEGER " +
            ")";

正如您所见,MARKS_01 到 MARKS_04 列具有 INTEGER 数据类型,但我不小心为其提供了一个具有如下 getter 和 setter 的浮点类型:-

public float getMO1() {
    return MO1;
}
public void setMO1(float MO1) {
    this.MO1 = MO1;
}
public float getMO2() {
    return MO2;
}
public void setMO2(float MO2) {
    this.MO2 = MO2;
}
public float getMO3() {
    return MO3;
}
public void setMO3(float MO3) {
    this.MO3 = MO3;
}
public float getMO4() {
    return MO4;
}
public void setMO4(float MO4) {
    this.MO4 = MO4;
}

public int getAttempts() {
    return Attempts;
}

public void setAttempts(int attempts) {
    Attempts = attempts;
}

而且,即使是整数数据类型,最终结果也让我感到惊讶,它对于浮点值非常有效

我想知道它背后的原因,要么是 SQL 数据库的属性,要么是任何错误

而且,我可以将此属性/错误用作其他数据库的加分项

【问题讨论】:

  • 因为 SQLite doesn't really have 不同的数据类型。一切都存储为字符串。您也可以在这些列中存储awesome
  • 来自:sqlite.org/datatype3.html#storage_classes_and_datatypesSQLite 版本 3 数据库中的任何列,除了 INTEGER PRIMARY KEY 列,都可以用于存储任何存储类的值。
  • @a_horse_with_no_name 那么SQLite中其他数据类型的意义是什么
  • 不知道。如果你愿意,你可以把它们排除在外。可能只是用于文档目的。
  • 在此处阅读 SQLite 的“类型亲和性”:sqlite.org/datatype3.html#type_affinity,其中提到:该类型是推荐的,不是必需的

标签: sqlite android-sqlite android-sql


【解决方案1】:

我想知道它背后的原因,要么是 SQL 数据库的属性,要么是任何错误

SQLite 的设计非常灵活,它的数据类型非常灵活,任何类型的数据都可以存储在任何类型的列中。例外是 rowid 或 rowid 的别名必须是整数。

  • 除非使用 WITHOUT ROWID 定义表,否则如果使用 INTEGER PRIMARY KEY(带或不带 AUTOINCREMENT)或隐式使用 INTEGER PRIMARY KEY 定义列,则表始终具有 rowid 列,则该列是 rowid 的别名(例如您的 P_K 列是 rowid 的别名)
    • 如果您使用了SELECT *,rowid FROM your_table,您会在结果(以及所有其他列)中看到P_K 列和rowid 列(两者的值相同)。

我相信这种灵活性允许相对简单地使用来自其他数据库的 SQL。例如VARCHAR(100) 将导致 TEXT 关联。

因此没有错误,灵活性是故意的。

而且,我可以将此属性/错误用作其他数据库的加分项

有时您需要考虑并满足对某些人不利的灵活性。数据类型处理方式的优点主要在于 SQLite 有效地存储数据。

  • 也许人们面临的最常出现的问题之一是使用 DATETIME 作为数据类型,这实际上导致了 NUMERIC 的亲和力(其他任何规则的统称)。人们通常认为这会将数据转换为基于时间的类型,该类型会自动转换数据(事实并非如此)。

阅读可以学到很多东西 Datatypes in SQLite Version 3

How flexible/restricive are SQLite column types? 从 Android 的角度通过一些示例讨论了灵活性。

【讨论】:

    猜你喜欢
    • 2017-05-28
    • 2015-06-12
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    相关资源
    最近更新 更多