Страница 1 из 1

Изменение 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. Кто курит зебру ?

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

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

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

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

Добавлено: 11 янв 2007, 12:52
Дартаньян
Допонял.
Спасибо всем.