Почему Android SQLite может хранить двойное значение (Java 8 байт) в столбце с плавающей точкой - PullRequest
4 голосов
/ 21 марта 2012
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);

Вы можете видеть, что значение 1.7976931348623157E308 находится вне диапазона значений FLOAT (4 байта) в sqlite.почему он может правильно хранить это значение?

Ответы [ 4 ]

5 голосов
/ 21 марта 2012

SQLite не имеет типа. Вы можете хранить любые данные в любом столбце любой таблицы, независимо от объявленного типа данных этого столбца.

SQLite также позволяет пропустить тип данных.

3 голосов
/ 21 марта 2012

SQLite3, в отличие от полноценных СУБД / СУБД, таких как Oracle, MSSQL и т. Д., Имеет множество ограничений.Во-первых, он не поддерживает много типов данных.

Как предложил @Ketan Patel, сохраните значение в виде 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.Значение представляет собой блок данных, сохраненный в точности так, как он был введен.

1 голос
/ 21 марта 2012

Не все sqls использовали фиксированную семантику: float равен 4 байта, а double - 8 байтов. Вместо этого некоторые разрешают переменные точности с плавающей точкой (внутренне, только 4 и 8 байтов разрешены с точки зрения хранения). В postgresql, если точность не указана, значения по умолчанию с плавающей запятой удваиваются.

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

PostgreSQL также поддерживает стандартные обозначения SQL float и float (p) для указания неточных числовых типов . Здесь р указывает минимальное допустимая точность в двоичных разрядах. PostgreSQL принимает float (1) для float (24) как выбор реального типа, а float (25) - float (53) выберите двойную точность. Значения p вне допустимого диапазона рисуют ошибка. Число с плавающей запятой без указания точности означает двойное точность .

Более актуальная документация для sqlite.

1.0 Классы хранения и типы данных

  • РЕАЛЬНЫЙ. Значение является значением с плавающей запятой, хранящимся как 8-байтовое число с плавающей запятой IEEE.

Позже на этой странице далее говорится, что REAL используется всякий раз, когда заданы REAL, DOUBLE, DOUBLE PRECISION или FLOAT.

0 голосов
/ 21 марта 2012

вы можете попробовать значения с плавающей запятой, чтобы преобразовать их в sting, вставить и получить просто, некоторые значения с плавающей запятой не получат больше значения, чем в то время, когда возникла эта проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...