Dass Oracle es mit den numerischen Datentypen nicht immer so genau nimmt, hatte ich gelegentlich schon beobachtet, aber das Verhalten von SMALLINT finde ich doch etwas eigenartig:
create table test_smallint
( id smallint );
insert into test_smallint
select rownum
from dual
connect by level <= 1000000;
1000000 Zeilen wurden erstellt.
insert into test_smallint(id) values (0.75);
1 Zeile wurde erstellt.
select * from test_smallint where id < 1;
Es wurden keine Zeilen ausgewählt
select * from test_smallint where id < 2;
ID
----------
1
1
Demnach kann man also auch Werte deutlich oberhalb von 32767 (oder von mir aus auch 65535) einfügen; und auch mit Kommazahlen gibt es keine Probleme beim Insert, da sie offenbar gerundet werden (was dem Verhalten von NUMBER bei Überschreitung der gewählten SCALE entspricht). Intern wird aus SMALLINT offenbar NUMBER(38,0):
select table_name
, column_name
, data_type
, data_precision
, data_scale
from user_tab_cols
where table_name = 'test_smallint'
TABLE_NAME COLUMN_NAME DATA_TYPE DATA_PRECISION DATA_SCALE
--------------- ------------- ----------- -------------- ----------
TEST_SMALLINT ID NUMBER 0
Angesichts dieser Ergebnisse scheint mir SMALLINT völlig zweckfrei zu sein.
Keine Kommentare:
Kommentar veröffentlichen