SQLite не имеет типов? - PullRequest
       3

SQLite не имеет типов?

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

Если sqlite не имеет типов, почему мы объявляем тип данных столбца?в чем польза от объявления типа данных?

Почему Android SQLite может хранить двойное значение (java 8 байт) в столбце с плавающей точкой

Ответы [ 3 ]

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

Объявленный тип данных столбца используется в качестве подсказки (http://sqlite.org/faq.html#q3):

Так, например, если столбец имеет тип INTEGER и вы пытаетесь вставить строку в этот столбец, SQLite попытаетсяпреобразовать строку в целое число. Если это возможно, он вставляет целое число вместо этого. Если нет, он вставляет строку. Эта функция называется типом соответствия.

Кстати, SQLite не является типизированным;он использует динамическую типизацию. Это означает, что любое добавляемое вами значение сохраняет свою собственную информацию о типе, а не выводит тип из объявления таблицы. http://sqlite.org/datatype3.html

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

Используется для определения «сродства» столбца.

CREATE TABLE Example (
    IntegerAffinity    INTEGER,
    RealAffinitity     REAL,
    NumericAffinity    NUMERIC,
    TextAffinity       TEXT,
    NoAffinity
);

Вставка некоторых значений в эту таблицу (с модулем Python sqlite3) дает:

>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [1234] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", ['1234'] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [math.pi] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [str(math.pi)] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", ['ABC'] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [b'5678'] * 5)
>>> db.execute("INSERT INTO Example VALUES(?, ?, ?, ?, ?)", [b'\xAB\xCD\xEF'] * 5)
>>> list(db.execute("SELECT * FROM Example"))
[(1234, 1234.0, 1234, '1234', 1234),
 (1234, 1234.0, 1234, '1234', '1234'),
 (3.141592653589793, 3.141592653589793, 3.141592653589793, '3.14159265358979', 3.141592653589793),
 (3.141592653589793, 3.141592653589793, 3.141592653589793, '3.141592653589793', '3.141592653589793'),
 ('ABC', 'ABC', 'ABC', 'ABC', 'ABC'),
 (b'5678', b'5678', b'5678', b'5678', b'5678'),
 (b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef', b'\xab\xcd\xef')]
  • В столбцах сходства текста числа преобразуются в строки.
  • В столбцах целочисленных, вещественных и числовых значений строки, содержащие числа, преобразуются в числа.
  • Строки, которые не содержат чисел, остаются строками даже в числовых столбцах.
  • Капли остаются блобами, независимо от сродства столбца.
  • В столбцах со сходством NONE значения вставляются как есть.
1 голос
/ 21 марта 2012

Ознакомьтесь с документацией.http://sqlite.org/datatype3.html

Чтобы максимизировать совместимость между SQLite и другими механизмами баз данных, SQLite поддерживает концепцию "соответствия типов" для столбцов.Сходство типов столбца является рекомендуемым типом для данных, хранящихся в этом столбце.Важной идеей здесь является то, что тип рекомендуется, не требуется .Любой столбец может хранить данные любого типа.Просто некоторые столбцы, при выборе, предпочитают использовать один класс хранения над другим.Предпочтительный класс хранения для столбца называется его «сходством».

Похоже, они пытаются поддерживать совместимость с другими СУБД.

Также они хотят иметь возможность делатьследующее:

... небольшие значения с плавающей запятой без дробного компонента и сохраненные в столбцах с РЕАЛЬНЫМ сходством записываются на диск как целые числа, чтобы занять меньше места, и автоматически конвертируются обратно в плавающееточка при считывании значения.

В конечном итоге сродство столбца определяется объявленным типом столбца, поэтому вы объявляете тип столбца.

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