На этом шаге мы рассмотрим особенности преобразования значений полей.
В целях совместимости с другими базами данных значение, указанное в параметре <Тип данных>, преобразуется в один из пяти классов родства:
Классы родства являются лишь обозначением предполагаемого типа данных, а не строго определенным значением. Иными словами, SQLite использует не статическую (как в большинстве баз данных), а динамическую типизацию. Например, если для поля указан класс INTEGER, то при вставке значения производится попытка преобразовать введенные данные в целое число. Если преобразовать не получилось, то производится попытка преобразовать введенные данные в вещественное число. Если данные нельзя преобразовать в целое или вещественное число, то будет произведена попытка преобразовать их в строку и т. д, Пример:
Рис.1. Использование классов родства
В этом примере мы воспользовались встроенной функцией typeof () для определения типа данных, хранящихся в ячейке таблицы. SQLite поддерживает следующие типы данных:
Если после INTEGER указаны ключевые слова PRIMARY KEY (т. е. поле является первичным ключом), то в это поле можно вставить только целые числа или значение NULL. При указании значения NULL будет вставлено число, на единицу большее максимального числа в столбце. Пример:
Рис.2. Примеры вставки значений
Класс NUMERIC аналогичен классу INTEGER. Различие между этими классами проявляется только при явном преобразовании типов с помощью инструкции CAST. Если строку, содержащую вещественное число, преобразовать в класс INTEGER, то дробная часть будет отброшена. Если строку, содержащую вещественное число, преобразовать в класс NUMERIC, то возможны два варианта:
Пример:
Рис.3. Особенности преобразования значений
На следующем шаге мы продолжим изучение этого вопроса.