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个字节)。为什么它可以正确存储这个值?
答案 0 :(得分:5)
SQLite是“无类型的”。您可以将任何类型的数据存储在任何表的任何列中,而不管该列声明的数据类型
SQLite还允许省略数据类型。
答案 1 :(得分:3)
SQLite3与Oracle,MSSQL等完全成熟的DBMS / RDBMS不同,它有很多局限性。首先,它不支持大量的数据类型。
正如@Ketan Patel建议的那样,将值存储为字符串并在需要访问数据时将值重新转换为float。我个人也遵循相同的方法考虑使用 string 数据类型可以节省很多麻烦。
有关支持的数据类型的详细信息,请参阅此链接:http://sqlite.org/datatype3.html
这是它的要点:
1.0存储类和数据类型
每个值存储在SQLite数据库中(或由...操纵) 数据库引擎)具有以下存储类之一:
NULL。该值为NULL值。
INTEGER。该值是有符号整数,存储为1,2,3,4,6或8个字节,具体取决于值的大小。
REAL。该值是浮点值,存储为8字节IEEE浮点数。
TEXT。该值是一个文本字符串,使用数据库编码(UTF-8,UTF-16BE或UTF-16LE)存储。
BLOB。该值是一个数据块,完全按照输入的方式存储。
答案 2 :(得分:1)
并非所有sqls都使用浮动为4字节且double为8字节的固定语义。相反,一些允许变量精度浮点数(内部,在存储方面只允许4和8个字节)。在postgresql中,如果没有指定精度,则float默认为double precision。
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)浮动(53) 选择双精度。 p在允许范围之外的值绘制a 错误。没有指定精度的 float被认为是double 精度强>
sqlite更相关documentation。
1.0存储类和数据类型
- REAL。该值是浮点值,存储为8字节IEEE浮点数。
稍后在该页面中,它继续说当指定REAL,DOUBLE,DOUBLE PRECISION或FLOAT时使用REAL。
答案 3 :(得分:0)
你可以尝试使用float值转换为string并插入并简单, 一段时间浮动值不会在此问题创建时获得更多值。