Опубликован: 07.05.2010 | Доступ: свободный | Студентов: 2867 / 291 | Оценка: 4.49 / 4.19 | Длительность: 25:58:00
Лекция 16:

Типы данных. Домены

< Лекция 15 || Лекция 16: 12 || Лекция 17 >
Аннотация: На этой лекции вы познакомитесь с типами данных InterBase и научитесь использовать домены.

Типы данных

Большинство SQL -серверов имеют схожие типы данных, хотя имеются и различия. После того обилия типов, к которому мы привыкли в базах данных Paradox или MS Access, может показаться, что SQL -серверы имеют очень ограниченный набор типов данных. Связано это в первую очередь, с ограничениями стандартов языка запросов SQL.

Например, InterBase не имеет:

  • Тип автоинкремент (автоматически увеличивающееся числовое поле). Нехватку такого важного типа можно компенсировать специальными числовыми генераторами.
  • Тип Boolean. Вместо него предлагается использовать символьный тип данных Char (1).
  • Тип Currency. Денежные типы данных придется хранить в обычных столбцах с вещественным типом данных.

В InterBase все настолько взаимосвязано, что очень сложно говорить о какой-то одной теме, не затрагивая при этом другие. На этой лекции мы коротко затронем вопрос создания таблиц, хотя полностью развернем эту тему позже. Таблицы создаются с помощью специального SQL -запроса, и для этого проще всего использовать утилиту для работы с базами данных. Если InterBase сервер у вас не запущен, запустите его. Также откройте утилиту IBConsole, войдите в локальный сервер и откройте базу данных FIRST. На панели задач находится кнопка Interactive SQL, которая запускает встроенную утилиту для редактирования выделенной базы данных:

Значок утилиты "Interactive SQL"

Рис. 16.1. Значок утилиты "Interactive SQL"

Нажав на эту кнопку, вы увидите окно Интерактивного SQL:

Interactive SQL

Рис. 16.2. Interactive SQL

На рисунке указаны основные кнопки, с которыми вам придется работать, и два окна: для ввода запроса, и для вывода результатов запроса. Строка состояния содержит адрес и имя текущей базы данных, в нашем случае это C:\DataBases\first.gdb. Все запросы, которые мы будем вводить, будут относиться к этой БД.

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

Целые числа

InterBase поддерживает два типа целых чисел:

SMALLINT - Короткое целое число (2 байта) со знаком. Диапазон значений от -32768 до 32767.

INTEGER (INT) - Длинное целое число (4 байта) со знаком. Диапазон значений от - 2147483648 до 2147483647.

Здесь рекомендации обычные: экономить на дисковом пространстве для чисел не стоит, поэтому используйте SMALLINT только в тех полях, которые никогда не будут содержать больших чисел. Во всех остальных случаях рекомендуется использовать длинное целое INTEGER, которое также можно обозначать сокращенным синтаксисом INT. Заметим здесь же, что длинное целое INTEGER также используется для ключевых автоинкрементных полей, идентифицирующих запись, а роль счетчика при этом играют генераторы.

В окне для запросов впишите следующий запрос:

CREATE TABLE Table_Cel(
   Korotkoe SMALLINT,
   Dlinnoe INT)

и нажмите кнопку Execute Query (Выполнить запрос). Этим запросом мы дали команду создать таблицу с именем "Table_Cel", которая содержит два поля: " Korotkoe ", имеющее тип SMALLINT, и " Dlinnoe " с типом INTEGER.

Если вы все сделали правильно, запрос исчезнет. Далее можно закрыть Interactive SQL или просто перейти на основное окно IBConsole. В дереве серверов выделите раздел Tables базы данных FIRST, и в правом окне увидите таблицу TABLE_CEL:

Новая таблица создана

Рис. 16.3. Новая таблица создана

Чтобы окончательно убедиться, что все получилось правильно, щелкните правой кнопкой по получившейся таблице и выберите команду Properties. Выйдет окно со списком полей на вкладке Properties. Вкладка Metadata содержит запрос, по которому была создана таблица, а на вкладке Data можно увидеть записи таблицы:

Отображение вкладки Metadata свойств таблицы TABLE_CEL

Рис. 16.4. Отображение вкладки Metadata свойств таблицы TABLE_CEL

Таким же образом вы сможете создавать следующие таблицы и контролировать правильность их параметров. Выполняйте все приводимые примеры создания таблиц, так как некоторые из них понадобятся нам в следующих лекциях.

Вещественные числа

К вещественным типам относятся:

FLOAT - Число с плавающей точкой одинарной точности (4 байта). Диапазон от 3,4*10-38 до 3,4*10+38. Значащих цифр 7.

DOUBLE PRECISION - Число с плавающей точкой двойной точности (8 байт). Диапазон от 1,7*10-308 до 1,7*10+308. Значащих цифр 15.

Типа данных REAL в InterBase не существует, однако попытка создать поле такого типа не приведет к ошибке, вместо этого InterBase создаст поле типа FLOAT. Попытки создать поле других вещественных типов, которые имеются в Delphi, приведут к ошибке.

Тип FLOAT не рекомендуется использовать там, где нужна точность расчетов дробных значений, особенно в денежных полях. Вместо привычного типа CURRENCY, которого нет в InterBase, лучше подойдет тип DOUBLE PRECISION. Пример:

CREATE TABLE Table_Vesh(
   Kol_Float FLOAT,
   Kol_Double DOUBLE PRECISION)

Здесь первое поле может содержать вещественные числа, имеющие не более 4 знаков после запятой. При попытке сохранить число "1,234567" реально будет записано число "1,2345". Второе поле обеспечивает большую точность сохраняемых данных.

В вещественных полях нельзя управлять количеством цифр после запятой, поэтому если вам потребуется, выводить только две цифры, в программе придется использовать маску ввода, например "#,###.##".

Числа с фиксированной точкой

Таких типов два: DECIMAL и NUMERIC, оба типа данных практически равнозначны. Не самые удобные в использовании типы. Они призваны задавать фиксированное количество чисел после запятой. Как известно, вещественные числа определяются двумя значениями:

  • Размер - общее количество цифр.
  • Точность - количество цифр после запятой.

DECIMAL / NUMERIC (Размер, точность) - Числа с плавающей точкой переменной точности. Оба типа равнозначны и могут использоваться с одинаковым результатом. Размер (от 1 до 15) указывает число значащих цифр. Точность (от 0 до 15) указывает число знаков после запятой. Точность должна быть меньше или равна размеру. Например,

Поскольку специальных типов DECIMAL и NUMERIC на самом деле не существует, вместо них используются другие типы столбцов. Правила таковы:

  • При указании размера числа от 1 до 4 будет использован столбец SMALLINT.
  • При указании размера числа от 5 до 9 будет использован столбец INTEGER.
  • При указании размера числа от 10 до 15 будет использован столбец DOUBLE PRECISION.

Как видите, в первых двух случаях используются целые типы столбцов, и если даже вы укажете точность, числа после запятой будут утеряны. Следовательно, чтобы сохранить вещественное число в полях DECIMAL и NUMERIC, требуется указать размер не менее 10 чисел. Пример запроса:

CREATE TABLE Table_Fiks(
   Kol_Dec DECIMAL(15,2),
   Kol_Dec2 NUMERIC(8,2))

При, казалось бы, похожем объявлении в первом случае мы получили вещественное поле, в котором может храниться число типа 9999999999999,99, зато второе поле сможет хранить только целую часть числа. То есть, при попытке сохранить число 123456,78, в таблице останется число 123456, а поле будет иметь тип INTEGER.

Даты и время

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

TIMESTAMP - тип данных, совместимый с типом TTimeStamp в Delphi. Содержит одновременно и дату, и время в виде двух целых 32-битовых чисел. Первое число содержит порядковый номер дня, прошедший с 01.01.0001. Второе число указывает количество миллисекунд, прошедших с полуночи. Этот тип может применяться как в первом, так и в третьем диалектах SQL.

DATE - тип данных для хранения значений только дат. Диапазон от 1 января 0001 г. до 31 декабря 9999 г. Поддерживается только в базах данных, использующих третий диалект SQL. Попытка создать поле типа DATE в базах данных с первым диалектом ошибки не вызовет, однако реально будет создано поле типа TIMESTAMP.

TIME - тип данных для хранения значений только времени. Диапазон времени от 00:00 до 23:59:59:9999. Поддерживается только в базах данных, использующих третий диалект SQL. Попытка создать поле типа TIME в базах данных с первым диалектом приведет к ошибке.

Обычно данные этих типов заполняются на компьютере клиента, а там все зависит от настроек операционной системы. Не следует забывать, что даты на компьютере пользователя могут выводиться по-разному, в зависимости от настроек ОС. Например, в английской вариации дат вначале указывается месяц, затем день, и год, тогда как у нас первым идет день. Кроме того, английская (американская) неделя начинается не с понедельника, а с воскресенья. А разделителем значений могут быть и точка ".", и слеш "/", и тире "-". Чтобы избежать конфликтов при работе вашей программы (клиентской части), полезно сразу программно переустановить формат даты и времени на компьютере клиента в привычный российский формат (пример ниже приводится для программ Delphi, а не для Interactive SQL ):

DateSeparator := '.';
ShortDateFormat := 'dd.mm.yyyy';
ShortTimeFormat := 'hh:mm:ss';

После этого в клиентской части программы дату и время спокойно можно вводить в привычном для нас формате. Пример создания таблицы с полями даты и времени (пример корректен только для 3 диалекта SQL ):

CREATE TABLE Table_DateTime(
    Kol_Date DATE,
    Kol_Time TIME,
    Kol_TimeStamp TIMESTAMP)
< Лекция 15 || Лекция 16: 12 || Лекция 17 >
Евгений Медведев
Евгений Медведев

В лекции №2 вставляю модуль данных. При попытке заменить name на  fDM выдает ошибку: "The project already contains a form or module named fDM!". Что делать? 

Анна Зеленина
Анна Зеленина

При вводе типов успешно сохраняется только 1я строчка. При попытке ввести второй тип вылезает сообщение об ошибке "project mymenu.exe raised exception class EOleException with message 'Microsoft Драйвер ODBC Paradox В операции должен использоваться обновляемый запрос'. 

Максим Козинда
Максим Козинда
Россия, Тюмень, ТюмГАСА, 2009
Елена Маслова
Елена Маслова
Россия, Новокузнецк, Сибирский государственный индустриальный университет, 2010