为什么具有整数数据类型的列也在 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 的角度讨论了一些示例的灵活性。
我用这条语句做了一个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