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

时间:2012-03-21 06:31:13

标签: java android sqlite

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个字节)。为什么它可以正确存储这个值?

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并插入并简单, 一段时间浮动值不会在此问题创建时获得更多值。