Изменение domain (9,2) на (15,2). ?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Дартаньян
Сообщения: 2
Зарегистрирован: 10 янв 2007, 17:22

Изменение domain (9,2) на (15,2). ?

Сообщение Дартаньян » 10 янв 2007, 19:48

Доброго.
FB server 1.5.2.4731, база диалект 1, IBExpert 2005.05.10.
Не могу понять что делается. Ситуация: в реальных FDB поменять тип полей,
определенных доменом TXXX numeric(9,2), на (15,2).
В базах b/r IB/FB без вопросов.
В базе, созданой под FB, изменение домена дает непонятный результат.

Проведены исследования. При исследованиях обнаружено:

Код: Выделить всё

CREATE DOMAIN TTMP AS NUMERIC(9,2)
RDB$FIELDS:
RDB$FIELD_LENGTH: 4,
RDB$FIELD_SCALE: -2,
RDB$FIELD_TYPE: 8, <--- INTEGER
RDB$FIELD_SUB_TYPE: 1, <--- Текст ( ?? )
RDB$SYSTEM_FLAG: 0, <--- пользовательский
RDB$FIELD_PRECISION: 9 <--- Точность числа (для вещественных типов)

Код: Выделить всё

ALTER DOMAIN TTMP TYPE NUMERIC(15,2)
RDB$FIELDS:
RDB$FIELD_LENGTH: 8,
RDB$FIELD_SCALE: -2,
RDB$FIELD_TYPE: 27, <--- DOUBLE
RDB$FIELD_SUB_TYPE: 1,
RDB$SYSTEM_FLAG: 0,
RDB$FIELD_PRECISION: 9 <--- ???

IBExpert настойчиво показывает домен TTMP как 9,2 .
Если посмотреть на поле в таблице по TTMP, IBExpert показывает его как 15,2 (??)
isql показывет как 15,2:

SQL> show domain TTMP;
TTMP NUMERIC(15, 2) Nullable

В RDB$FIELDS select показывает гибрид - в меру моей колокольни.

Вопросы:

1. Почему RDB$FIELD_PRECISION не изменяется на 15 ?
Почему при CREATE DOMAIN TTMP1 AS NUMERIC(15,2)
имеем(я) : RDB$FIELD_SUB_TYPE null; RDB$FIELD_PRECISION null ?

2. Есть ли альтернатива что то сделать с тем типом даных
кроме вариантов alter table TBTABLE alter FFIELD type TNEW_TYPE ?

3. Кто курит зебру ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 10 янв 2007, 20:26

в первом диалекте ты меняешь integer на double precision. Косяков с вещественными числами не оберешься. Я бы сначала забил на первый диалект, и перевел бы базу на третий. А уж потом, транслируй себе integer в int64 на здоровье.
IBExpert настойчиво показывает домен TTMP как 9,2
я тебе его могу и как varchar показать.
Почему RDB$FIELD_PRECISION не изменяется на 15 ?
потому что в случае double precision значения не имеет, он всегда 15.

В общем, впечатление такое, что ты не осознаешь, что делаешь, и к каким последствиям это приведет.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 10 янв 2007, 20:26

В первом диалекте Numeric (15,2) базируется на дабл, precision просто игноруется - всегда по максимуму базового типа. Важен только scale и то для визуализации на клиенте, все операции выполняются с "хвостатым" числом, что там в мантиссу влезает. Бросать precision как попало после альтера - грязненько, согласен, ну, что выросло, то выросло (С).

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 10 янв 2007, 20:28

kdv писал(а):в первом диалекте ты меняешь integer на double precision. Косяков с вещественными числами не оберешься.
С нумериками, базированными на int64, тоже косяков не оберёшься, правда других.

Дартаньян
Сообщения: 2
Зарегистрирован: 10 янв 2007, 17:22

Сообщение Дартаньян » 11 янв 2007, 12:52

Допонял.
Спасибо всем.

Ответить