Часть 5.2: Классы данных вместо типов данных в SQLite3

Здравствуйте, уважаемые посетители сайта ZametkiNaPolyah.ru. Продолжаем изучать базы данных и наше знакомство с библиотекой SQLite3. В данной записи мы познакомимся с понятием класса данных в SQLite3, посмотрим какие классы данных поддерживает SQLite3, а какие нет, а также мы разберемся с механизмами обработки классов данных ядром SQLite3: как хранятся данные на сервере и что с ними происходит, когда мы обращаемся к таблицам под управлением SQLite3.


 SQLite3 вместо типов данных использует классы данных. Классы данных в SQLite3 – это более широкое понятие, нежели тип. Любое значение в SQLite3 может иметь один из пяти классов:

  • NULL – пустое значение или его отсутствие. Значение NULL в SQLite3, как и во многих других СУБД и языках программирования уникально, то есть оно не равно ни другому NULL ни еще какому-либо значению. На NULL можно только проверить;
  • INTEGER – класс данных INTEGER в SQLite3 используется для хранения целочисленных значений, которые хранятся в 1, 2, 3, 4, 6 или 8 байтах, в зависимости от самого значения;
  • REAL – класс данных REAL в SQLite3 предназначен для хранения вещественных чисел, данные в классе REAL хранятся в формате восьмибайтного числа IEEE с плавающей точкой (вспомните школьную математику, где вам рассказывали про мантиссу и порядок);
  • TEXT – класс данных TEXT в SQLite3 используется для хранения строковых значений, в базе данных данные с классом TEXT хранятся с использованием кодировки UTF-8 или UTF-16 (это можно настроить, рекомендуем использовать UTF-8);
  • BLOB – класс данных BLOB в SQLite3 используется для хранения бинарных данных, данные с классом BLOB хранятся в том виде, в котором они были введены.

В SQLite3 довольно интересно реализован процесс хранения и обработки данных. Например, числа в базе данных с классом INTEGER хранятся на диске по-разному и могут занимать разное количество байт, но, когда мы делаем запрос, числа поступают в оперативную память и приводятся к восьмибайтному формату.

Любой столбец таблицы в SQLite3 может быть использован для хранения любого класса данных, за исключением столбца, который был явно объявлен, как INTEGER PRIMARY KEY.

Давайте теперь перечислим те классы данных, которых нет в SQLite3:

  • в SQLite3 нет ни логического класса данных ни логического типа данных, вместо этого разработчики SQLite3 предлагают использовать 0 или 1;
  • в SQLite3 нет класса данных даты и времени, но функции для работы с датой и времен есть, подробнее про дату и время мы поговорим в следующей части.

Вот такие особенности типизации данных в SQLite3.

2 комментария к записи Часть 5.2: Классы данных вместо типов данных в SQLite3

Александра А.

Здравствуйте! Не подскажите, а для меня, как для пользователя sqlite, в чем плюсы и в чем минусы из-за того что в sqlite нет типов данных, а есть классы?

Кирилл

Особой разницы никакой, повторюсь, что класс данных — это более широкое понятие, нежели тип. Минусы классов данных в том, что не всегда можно легко найти ошибку в своем коде в тех ситуациях, когда другие СУБД будут выдавать ошибки из-за несовместимости типов данных, а SQLite будет пытаться преобразовать один класс данных в другой, чтобы выполнить нужную операцию и будет выполнять, но по обычной логике такие операции выполняться не должны и иногда даже бывают вредны. Вам нужно быть очень внимательной, когда работаете с классами данных в SQLite. Что же касается плюсов: вам не нужно запоминать все многообразие типов данных, т.к. классов данных всего пять, вам не нужно долго думать о выборе типа данных для столбца, условно: char, varchar и пр., в SQLite3 есть только текст, который на жестком диске под одно значение использует ровно столько байт, сколько занимает значение, а что потом с этим текстом происходит при запросе, на самом деле, это интимные подробности SQLite3, которые разработчику вообще не сильно интересны.

Текст комментария: