|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
Сервер 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 Т.е. последняя цифра в хвосте влияет на сравнение. Почему так происходит, что я делаю не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 16:15 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
VictorIn, 1) в 1 диалекте numeric и есть double. 2) не надо делать примеры в IBExpert. надо в isql 3) переходите на 3 диалект ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 16:20 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
15.12.2017 16:15, VictorIn пишет: > Не могу понять как должен работать Numeric. > У меня он себя ведет идентично Double Precision. именно так как описано в доке. читай про отличия в диалектах. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 16:20 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
VictorInВ какой момент должно происходить "обрезание" хвостов?На сервере - ни в какой. Обрезание делают компоненты доступа, если хотят. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 16:43 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
Мимопроходящий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, если его используют? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 16:51 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
VictorInВ чем тогда смысл Numeic в первом диалекте, в отличии от Double Precision, если его используют? Весь первый диалект - пережиток прошлого, от которого разработчики решили избавиться ещё 20 лет назад. Засунь его обратно в ту могилу из которой достал и перестань заниматься некрофилией. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 17:00 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 17:07 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
VictorIn, я тебе скажу больше NUMERIC и DECIMAL и в 3 диалекте "фикция". Читай внимательней как они хранятся в зависимости от требуемой точности. В 1-м диалекте просто не было 64-битного целого, поэтому пришлось хранить в DOUBLE PRECISION. Всё что делают NUMERIC и DECIMAL это просто хранят точность и масштаб, а реальные операции происходят над типами в которых хранятся значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 17:10 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
Симонов Денис, 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 18:21 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
15.12.2017 18:21, VictorIn пишет: > Т.е. Numeric ничего не значит, т.е. это просто description? Для каких целей тогда его вводили в 1-ом диалекте? чти ссылку которую я дал Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 18:24 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
VictorInТ.е. Numeric ничего не значит, т.е. это просто description? Для каких целей тогда его вводили в 1-ом диалекте? Его вводили когда компьютеры были большими, а ОЗУ 32Кб и диск 250 Мб были барством. Ты почитай всё-таки что тебе посоветовали, будешь удивлён ещё раз тем, что Numeric и Decimal далеко не всегда Double, зависит от x в (x,y). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 18:52 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
VictorInТ.е. Numeric ничего не значит, т.е. это просто description? Для каких целей тогда его вводили в 1-ом диалекте? для тех, что это стандарт. А дальше - мэппинг на физические типы. Вы как-то странно читаете документацию, одно читаете, а другое - нет. Как хранится numeric(8,2)? хранится в integer. Причем, вводимое сначала умножается на 100 (10 во второй степени), потом сохраняется в int. При возврате из сервера - наоборот. Это вот что - "ничего не значит"? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 19:08 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
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" типа читай между строк, что это только все из-за поддержания стандартна и "хранит как" - такого нету. Оказывается есть) Но не для моего случая((( ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 19:46 |
|
Непонятное поведение Numeric в Firebird 2.5
|
|||
---|---|---|---|
#18+
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. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2017, 19:55 |
|
|
start [/forum/topic.php?fid=40&fpage=38&tid=1561303]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 146ms |
0 / 0 |