Хелен Борри - Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Название:Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2006
- Город:Санкт-Петербург
- ISBN:5-94157-609-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Хелен Борри - Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ краткое содержание
Рассмотрены вопросы, необходимые разработчику для создания клиент-серверных приложений с использованием СУБД Firebird, явившейся развитием СУБД Borland Interbase 6. Содержится обзор концепций и моделей архитектуры клиент/сервер, а также практические рекомендации по работе с клиентскими библиотеками Firebird. Детально описаны особенности типов данных SQL, язык манипулирования данными (Data Manipulation Language, DML), а также синтаксис и операторы языка определения данных ( Data Definition Language, DDL). Большое внимание уделено описанию транзакций и приведены советы по их использованию при разработке приложений. Описано программирование на стороне клиента и сервера написание триггеров и хранимых процедур, создание и использование событий базы данных, обработка ошибок в коде на сервере и многое другое. Материал сопровождается многочисленными примерами, советами и практическими рекомендациями.
Для разработчиков баз данных
Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
SELECT 1/3 AS RESULT FROM RDB$DATABASE
Это дает .333333333333333.
Хотя настоящее правило диалекта 1 является интуитивным для языков программирования, оно не соответствует стандарту SQL-92. Целые типы имеют масштаб 0. Для согласованности это требует, чтобы результат (частное) любой операции деления целого на целое соответствовал правилам масштабирования для чисел с фиксированной точкой и был бы целым.
Диалект 3 соответствует стандарту и усекает частное от операций деления целого на целое до целого. Следовательно, следующий оператор является неразумным:
SELECT 1/3 AS RESULT FROM RDB$DATABASE
Он вернет 0.
Если вам нужно сохранить дробную часть в результате (в частном) деления целого на целое в диалекте 3, убедитесь, что у одного из операндов присутствует нужный масштаб, или включите "множитель" в выражение, чтобы гарантировать масштаб результата.
Примеры:
SELECT 1.00/3 AS RESULT FROM RDB$DATABASE
Вернет .33.
SELECT (5 * 1.00)/2 AS RESULT FROM RDB$DATABASE
Этот вернет 2.50.
База данных диалекта 1, которая была открыта клиентом диалекта 3, может преподнести некоторые сюрпризы в отношении деления целых чисел. Когда операция выполняет нечто, что приводит к проверке условия CHECK, или выполняется хранимая процедура или триггер, то осуществляемые действия основаны на диалекте, на котором CHECK, хранимая процедура или триггер были определены, а не на действующем диалекте, на котором приложение выполняет проверку, хранимую процедуру или триггер.
Например, в базе данных диалекта 1 таблица содержит столбцы MYCOL1 (INTEGER) и MYCOL2 (INTEGER) и следующее условие CHECK, которое было определено, когда база данных имела диалект 1:
CHECK(MYCOL1 / MYCOL2 >0.5)
Пусть теперь пользователь запускает isql или приложение, задав диалект 3. Программа пытается добавить строку в конвертированную базу данных:
INSERT INTO MYTABLE (COL1, COL2) VALUES (2,3);
Поскольку ограничение CHECK было определено в диалекте 1, оно вернет частное 0.666666666666667, и строка будет соответствовать условию CHECK.
Обратное также верно. Если то же ограничение CHECK было добавлено в базу данных диалекта 1 из клиента диалекта 3, то для ограничения будет сохранена арифметика диалекта 3. Предыдущий оператор INSERT не будет выполнен, потому что проверка вернет значение частного 0, которое нарушает это ограничение.
! ! !
СОВЕТ. Мораль всего этого: используйте базы данных диалекта 3 и всегда соединяйтесь с ними, применяя диалект 3. Если вы собираетесь использовать Firebird, то обновите все существующие базы данных до диалекта 3 - желательно описав новую базу данных и поместив в нее ваши старые данные - таким образом вы сохраните покой и сможете избежать уймы неприятных сюрпризов.
. ! .
Если оба операнда являются точными числами, умножение операндов даст точное число с масштабом, равным сумме масштабов операндов. Например,
CREATE TABLE t1 (
n1 NUMERIC(9,2),
n2 NUMERIC (9,3) ) ;
COMMIT;
INSERT INTO t1 VALUES (12.12, 123.123);
COMMIT;
Следующий запрос возвращает число 1492.25076, потому что n1 имеет масштаб 2, а n2 - масштаб 3. Сумма масштабов 5.
SELECT n1*n2 FROM t1
В диалекте 3 точность результата умножения чисел с фиксированной точкой будет равна 18. Нужно принять меры предосторожности, чтобы быть уверенным, что не будет переполнения результата при распространении масштаба в умножении.
В диалекте 1, если распространение масштаба приводит к тому, что вычисление даст результат с точностью больше 9, то результатом будет DOUBLE PRECISION.
Если все операнды являются точными числами, то сложение и вычитание операндов даст точное число с масштабом, равным максимальному масштабу операндов. Например,
CREATE TABLE t1 (
n1 NUMERIC(9, 2) ,
n2 NUMERIC(9, 3)) ;
COMMIT;
INSERT INTO t1 VALUES (12.12, 123.123);
COMMIT;
SELECT n1 + n2 FROM t1;
Этот запрос возвращает 135.243, выбирая максимальный масштаб операндов. Аналогично, следующий запрос возвращает число -111.003:
SELECT n1 - n2 FROM t1;
В диалекте 3 результат любого сложения или вычитания имеет тип NUMERIC(18,n). В диалекте 1 он имеет тип NUMERIC (9, n), где n - масштаб максимального операнда.
Числовой ввод и показатели степени
Любые числовые строки в DSQL, которые могут быть сохранены как DECIMAL(18,S), вычисляются без потери точности, что могло бы произойти при промежуточном сохранении в виде DOUBLE. Синтаксический анализатор DSQL можно заставить распознавать числовые строки как числа с плавающей точкой при использовании научной нотации - если добавить символ "е" или "Е" перед показателем степени, который может быть нулевым.
Например, DSQL распознает 16.92 как масштабируемое точное число и передаст его серверу в этой форме. С другой стороны, он будет трактовать 16.92Е0 как значение с плавающей точкой.
Типы данных с плавающей точкой
Типы данных с плавающей точкой служат "скользящими окнами" с точностью, подходящей масштабу числа. По своей природе в "плавающих" типах положение десятичной точки не зафиксировано - допустимо хранение в одном и том же столбце одного значения как 25.33333, а другого как 25.333. Эти значения различны и оба допустимы.
Определяйте столбцы с плавающей точкой, когда вам нужно хранить числа с изменяющимся масштабом. Основное простое правило выбора типа с плавающей точкой вместо типа с фиксированной точкой: "используйте их для значений, которые вы измеряете, а не которые вы считаете". Если столбец или переменная типа плавающей точки должны использоваться для хранения денежных величин, вам нужно быть внимательным к округлению и результатам вычислений.
Числа с плавающей точкой могут быть использованы для представления значений, больших, чем это возможно для масштабируемых целых. Например, тип FLOAT может содержать числа с абсолютным значением не более 3.4Е38 (т. е. 34, за которым следует 37 нулей) и не менее 1.1Е-38 (37 нулей, 11 и затем десятичная точка).
Ширина диапазона достигается за счет потери точности. Число с плавающей точкой содержит приблизительное представление его значения с точностью до указанного количества цифр (его точности) в соответствии с текущим значением (масштабом). Оно не может содержать значение за пределами его диапазона.
Значение с плавающей точкой несет больше информации, чем указанное количество цифр точности. Например, тип FLOAT имеет точность 7 цифр, но его реальная точность 6 цифр. Последняя часть предоставляет дополнительную информацию о числе, такую как индикатор для округления и некоторые другие вещи, важные при выполнении арифметических операций с числом.
Например, FLOAT может содержать число 1000000000 (1 000 000 000 или 10(^9^)). "Контейнер" FLOAT рассматривает данное число как 100000*Е4. (Это лишь иллюстрация - полное представление реализации чисел с плавающей точкой выходит за рамки настоящей книги и очень далеко от того, что узнал автор!). Если вы прибавите 1 к значению FLOAT, то будет проигнорирована информация в седьмом разряде, потому что она не является значимой для текущего значения числа и его точности. Если же вы прибавляете 10 000 - число, которое значимо для хранимого в типе FLOAT числа, - то результатом может быть 100001*Е4.
Читать дальшеИнтервал:
Закладка: