powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Непонятное поведение Numeric в Firebird 2.5
15 сообщений из 15, страница 1 из 1
Непонятное поведение Numeric в Firebird 2.5
    #39570419
VictorIn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сервер Firebird 2.5.7.27050 Super
Диалект 1

Не могу понять как должен работать Numeric.
У меня он себя ведет идентично Double Precision.
Правильно ли я понимаю, что Numeric это всего лишь представление Double Precision, но...
В какой момент должно происходить "обрезание" хвостов?
Я это не могу получить, как при сохранении данных в Numeric поле, так и при запросах из такого поля.
При операциях сравнения Numeric так же продолжает себя вести, как Double Precision

Вот пример (делаю в IBExpert):

Создаем таблицу
CREATE TABLE TABLE1 (
NUM1 NUMERIC(15,6),
NUM2 NUMERIC(15,6)
);

вставляем следующие значения:
INSERT INTO TABLE1 (NUM1, NUM2)
VALUES (0.012345678901 2 , 0.012345678901 3 );

Т.е. значения отличаются последней цифрой хвоста, которая по идее должна отрезаться в Numeric(15,6)

В гриде IBExpert данные отображаются с отрезанными хвостами после 6-го знака. Все ок.
Но если перевести тип полей в Double Precision, то хвосты появляются.
Т.е. данные сохранились в Numeric с хвостами. Это раз.
Но даже черт с ним, с сохранением. Почему при при операциях сравнения эти хвосты не отбрасываются и учитываются?

Вот пример:
Возвращаем тип полей обратно в Numeric (15,6) (для чистоты эксперимента можно таблицу удалить и создать заново)

Следующий запрос вернет NULL
select * from TABLE1 where NUM1 = NUM2

И следовательно, вот этот запрос вернет строку
select * from TABLE1 where NUM1 <> NUM2

Т.е. последняя цифра в хвосте влияет на сравнение.
Почему так происходит, что я делаю не так?
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570425
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictorIn,

1) в 1 диалекте numeric и есть double.
2) не надо делать примеры в IBExpert. надо в isql
3) переходите на 3 диалект
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570426
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
15.12.2017 16:15, VictorIn пишет:
> Не могу понять как должен работать Numeric.
> У меня он себя ведет идентично Double Precision.

именно так как описано в доке.
читай про отличия в диалектах.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570443
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictorInВ какой момент должно происходить "обрезание" хвостов?На сервере - ни в какой.
Обрезание делают компоненты доступа, если хотят.
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570450
VictorIn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий15.12.2017 16:15, VictorIn пишет:
> Не могу понять как должен работать Numeric.
> У меня он себя ведет идентично Double Precision.

именно так как описано в доке.
читай про отличия в диалектах.


Т.е. Numeric в первом диалекте это фикция?
В доке
http://www.ibase.ru/files/firebird/Firebird_2_5_Language_Reference_RUS.pdf
написано:

Firebird предлагает два типа данных с фиксированной точкой: NUMERIC и DECIMAL. В
соответствии со стандартом оба типа ограничивают хранимое число объявленным масштабом
(количеством чисел после запятой). При этом подход к тому, как ограничивается точность для
типов разный: для столбцов NUMERIC точность является такой, «как объявлено», в то время
как DECIMAL столбцы могут получать числа, чья точность, по меньшей мере, равна тому, что
было объявлено.Типы данных
30
Например, NUMERIC(4, 2) описывает число, состоящее в общей сложности из четырёх цифр,
включая 2 цифры после запятой; итого 2 цифры до запятой, 2 после. При записи в столбец с
этим типом данных значений 3,1415 в столбце NUMERIC(4, 2) будет сохранено значение 3,14.


Но ни какого сохранения с "обрезанием" не происходит. Хвосты остаются.
Но самое печальное, что отрезание хвостов не происходит и при операциях сравнения.
Я отдаю себе отчет, что что Numeric что это обертка Double Precision в первом диалекте.
Но я так понимаю, что Numeric только и нужен для того, что бы не использовать всякие промежуточные, грузящие сервер приведения FormatFloat при операциях сравнение. Где то на SQL.ru об этом и написано.

В документации не сказано, что это все не работает для первого диалекта.
В чем тогда смысл Numeic в первом диалекте, в отличии от Double Precision, если его используют?
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570455
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictorInВ чем тогда смысл Numeic в первом диалекте, в отличии от Double Precision, если его
используют?

Весь первый диалект - пережиток прошлого, от которого разработчики решили избавиться ещё
20 лет назад. Засунь его обратно в ту могилу из которой достал и перестань заниматься
некрофилией.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570458
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
15.12.2017 16:51, VictorIn пишет:
> В документации не сказано, что это все не работает для первого диалекта.

https://firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-background.html#fblangref25-structure-dialects
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570461
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictorIn,

я тебе скажу больше NUMERIC и DECIMAL и в 3 диалекте "фикция". Читай внимательней как они хранятся в зависимости от требуемой точности. В 1-м диалекте просто не было 64-битного целого, поэтому пришлось хранить в DOUBLE PRECISION. Всё что делают NUMERIC и DECIMAL это просто хранят точность и масштаб, а реальные операции происходят над типами в которых хранятся значения.
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570508
VictorIn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Dimitry SibiryakovВесь первый диалект - пережиток прошлого, от которого разработчики решили избавиться ещё
20 лет назад. Засунь его обратно в ту могилу из которой достал и перестань заниматься
некрофилией.


Это я понимаю. Просто пришлось древний проект открыть. На третий диалект нет возможности перейти.

Симонов ДенисVictorIn,

я тебе скажу больше NUMERIC и DECIMAL и в 3 диалекте "фикция". Читай внимательней как они хранятся в зависимости от требуемой точности. В 1-м диалекте просто не было 64-битного целого, поэтому пришлось хранить в DOUBLE PRECISION. Всё что делают NUMERIC и DECIMAL это просто хранят точность и масштаб, а реальные операции происходят над типами в которых хранятся значения.

Т.е. Numeric ничего не значит, т.е. это просто description? Для каких целей тогда его вводили в 1-ом диалекте?
Тогда вопрос, есть ли красивый способ отбрасывать хвосты в операциях сравнения в 1-ом диалекте вместо UDF,
аля FormatFloat отcюда?: http://www.ibase.ru/round/

Вижу только Round, но он немного по другому округляет нежели FormatFloat.
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570510
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
15.12.2017 18:21, VictorIn пишет:
> Т.е. Numeric ничего не значит, т.е. это просто description? Для каких целей тогда его вводили в 1-ом диалекте?

чти ссылку которую я дал
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570523
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictorInТ.е. Numeric ничего не значит, т.е. это просто description? Для каких целей тогда его вводили в 1-ом диалекте?


Его вводили когда компьютеры были большими, а ОЗУ 32Кб и диск 250 Мб были барством. Ты почитай всё-таки что тебе посоветовали, будешь удивлён ещё раз тем, что Numeric и Decimal далеко не всегда Double, зависит от x в (x,y).
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570531
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictorInТ.е. Numeric ничего не значит, т.е. это просто description? Для каких целей тогда его вводили в 1-ом диалекте?
для тех, что это стандарт. А дальше - мэппинг на физические типы. Вы как-то странно читаете документацию, одно читаете, а другое - нет.
Как хранится numeric(8,2)? хранится в integer. Причем, вводимое сначала умножается на 100 (10 во второй степени), потом сохраняется в int. При возврате из сервера - наоборот. Это вот что - "ничего не значит"?
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570551
VictorIn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvдля тех, что это стандарт. А дальше - мэппинг на физические типы. Вы как-то странно читаете документацию, одно читаете, а другое - нет.
Как хранится numeric(8,2)? хранится в integer. Причем, вводимое сначала умножается на 100 (10 во второй степени), потом сохраняется в int. При возврате из сервера - наоборот. Это вот что - "ничего не значит"?

Спасибо! Вы исчерпывающе дали ответ на все мои вопросы!

Да, я изначально понял, что меня ткнули в первый пункт дока
"Dialect 1 is intended solely to allow backward comptibility with legacy databases from very old InterBase versions, v.5 and below"

типа читай между строк, что это только все из-за поддержания стандартна и "хранит как" - такого нету.
Оказывается есть) Но не для моего случая(((
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570553
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VictorInтипа читай между строк, что это только все из-за поддержания стандартна и "хранит как" - такого нету.
Оказывается есть) Но не для моего случая(((
не надо читать между строк. numeric и decimal - это логические типы данных для хранения чисел с фиксированной точкой. Из SQL стандарта.
В зависимости от количества цифр и точности numeric и decimal исходно, в InterBase до версии 6, хранились в smallint, integer и double precision.
Double precision для максимальных "размеров" был выбран потому, что другого "элементарного" типа для отображения numeric больше 9,0 не было.

В InterBase 6 ввели новый внутренний тип - int64. Из sql им пользоваться было нельзя, но в него отображались numeric и decimal с длиной больше 9 цифр.
Потом, в Firebird 1.0, int64 вывели "наружу", сделав из него bigint.

А диалекты - ну вот решили так при разработке ИБ 6 сделать, чтобы старые программы, которые НЕ ЗНАЛИ ни про какие диалекты, работали типа в диалекте 1, как раньше. А те, которые могли указать диалект 3 - работали бы с numeric(9,x) по другому, через int64.
...
Рейтинг: 0 / 0
Непонятное поведение Numeric в Firebird 2.5
    #39570555
VictorIn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Спасибо! Все доходчиво объяснили.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Непонятное поведение Numeric в Firebird 2.5
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]