为什么具有整数数据类型的列也在 SQL 数据库中存储浮点值

Why columns with integer data type is also storing the float values in SQL data base

我用这条语句做了一个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 数据库的 属性 还是任何错误

而且,我可以使用这个 property/bug 作为我其他数据库的加分点吗

I want to know the reason behind it, either it is a property of SQL database or any bug

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

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

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

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

And, can I use this property/bug as a plus point for my other databases

有时您需要考虑和迎合灵活性,这对某些人来说可能是不利的。处理数据类型的优点主要在幕后,因为 SQLite 可以有效地存储数据。

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

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

从 Android 的角度讨论了一些示例的灵活性。