为什么android SQLite可以将double值(java 8字节)存储到float列中

Create Table: db.execSQL("CREATE TABLE " + PERSONS_TABLE + " (" + PersonsColumns.ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " ... + PersonsColumns.HEIGHT + " FLOAT, " + PersonsColumns.CITY + " STRING);"); Write Data: ContentValues values = new ContentValues(); alues.put(PersonsColumns.HEIGHT, 1.7976931348623157E308); db.insertOrIgnore(values); 

您可以在sqlite中看到值1.7976931348623157E308超出FLOAT值范围(4个字节)。 为什么它可以正确存储这个值?

SQLite是“无类型的”。您可以将任何类型的数据存储在任何表的任何列中,而不管该列的声明数据类型如何

SQLite还允许省略数据类型。

SQLite3与Oracle,MSSQL等完全成熟的DBMS / RDBMS不同,它有很多局限性。 首先,它不支持大量的数据类型。

正如@Ketan Patel建议的那样,将值存储为字符串并在需要访问数据时将值转换回float。我个人也遵循相同的方法,因为使用字符串数据类型可以节省很多麻烦。

有关支持的数据类型的更多信息,请参阅此链接: http : //sqlite.org/datatype3.html

这是它的要点:

1.0存储类和数据类型

存储在SQLite数据库中(或由数据库引擎操纵)的每个值都具有以下存储类之一:

空值。 该值为NULL值。

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

真实。 该值是浮点值,存储为8字节IEEE浮点数。

文本。 该值是一个文本字符串,使用数据库编码(UTF-8,UTF-16BE或UTF-16LE)存储。

BLOB。 该值是一个数据块,与输入完全一样。

并非所有sqls都使用浮动为4字节且double为8字节的固定语义。 相反,一些允许变量精度浮点数(内部,在存储方面只允许4和8个字节)。 在postgresql中,如果没有指定精度,则float默认为double精度。

http://www.postgresql.org/docs/8.1/static/datatype.html#DATATYPE-FLOAT

PostgreSQL还支持SQL标准符号float和float(p)来指定不精确的数字类型 。 这里,p指定二进制数字的最小可接受精度。 PostgreSQL接受float(1)到float(24)选择真实类型,而float(25)到float(53)选择双精度。 超出允许范围的p值会产生错误。 未指定精度的浮点数表示双精度

有关sqlite的更多相关文档 。

1.0存储类和数据类型

  • 真实。 该值是浮点值,存储为8字节IEEE浮点数。

稍后在该页面中,它继续表示只要指定了REAL,DOUBLE,DOUBLE PRECISION或FLOAT,就会使用REAL。

你可以尝试浮点值转换为sting和insert并变得简单,有些时候浮点值不会在创建此问题时获得更多值。