Donnerstag, April 28, 2011

SMALLINT

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