반응형

컬럼에 데이터 타입을 지정한 경우와 지정하지 않은 경우로 각각 테이블을 만들고, 거기에 다양한 데이터를 저장하면 어떤 데이터 타입으로 저장되는지에 대해 알아 보겠다. 역시 저장된 값은 결국에 NULL, INTEGER, REAL, TEXT, BLOB 이렇게 5가지 데이터 타입으로 분류된다.

컬럼에 데이터 타입을 지정하지 않은 경우

예로서 데이터베이스를 하나 만들고 다음과 같이 테이블을 데이터베이스에 작성한다. 테이블에는 컬럼이 두 가지이고, 컬럼에 데이터 타입을 지정하지 않는다. 이전에 언급했듯이, 컬럼에 데이터 타입을 지정하지 않은 경우는 NONE 타입이 되고, 컬럼에 저장된 값은 자동 변환되지 않고 그대로 저장된다.

create table test (val1, val2);
$ sqlite3 test.sqlite3
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.
sqlite> 
sqlite> create table test (val1, val2);
sqlite> 

테이블에 데이터 3개를 저장하도록 하겠다.

insert into test values(null, 51);
insert into test values(3.14, 'devkuma');
insert into test values('Good Morning', 1.3e-2);
sqlite> 
sqlite> insert into test values(null, 51);
sqlite> insert into test values(3.14, 'devkuma');
sqlite> insert into test values('Good Morning', 1.3e-2);
sqlite> 

저장 한 데이터를 조회해 본다.

select * from test;

보기 쉽게 모드(.mode)와 헤더(.header)의 설정을 변경하고 있다.

sqlite> 
sqlite> select * from test;
|51
3.14|devkuma
Good Morning|0.013
sqlite> 
sqlite> .mode column
sqlite> .header on
sqlite> 
sqlite> select * from test;
val1        val2      
----------  ----------
            51        
3.14        devkuma   
Good Morni  0.013     
sqlite> 

이번에는 값의 데이터 타입을 확인해 보려고 한다. 값의 데이터 타입은 typeof 함수를 사용해 확인 할 수 있기에 다음과 같이 값과 그 값의 데이터 타입을 이어서 표시하도록 데이터를 조회해 보자.

select val1, typeof(val1), val2, typeof(val2) from test;
sqlite> 
sqlite> select val1, typeof(val1), val2, typeof(val2) from test;
val1        typeof(val1)  val2        typeof(val2)
----------  ------------  ----------  ------------
            null          51          integer     
3.14        real          devkuma     text        
Good Morni  text          0.013       real        
sqlite> 

null은 NULL, 정수는 INTEGER 타입, 문자열은 TEXT 타입, 부동 소수점은 REAL 타입으로 저장되어 있다. 이와 같이 추가된 값에 따라 저장된 값의 데이터 타입이 설정되어 있는 것을 확인할 수 있다.

컬럼에 데이터 타입을 지정하는 경우

앞에서는 컬럼 데이터 타입을 지정하지 않고 테이블을 작성하였는데, 이번에는 다양한 데이터 타입을 컬럼으로 설정했을 때에 값이 어떻게 저장되는지를 확인하려고 한다.

예로서 다음과 같이 테이블을 만든다. 테이블에는 열이 두 가지가 있고 첫 번째 컬럼은 TEXT 타입, 두 번째 컬럼에는 NUMERIC 타입을 설정하고 있다.

create table test2 (val1 text, val2 numeric);
sqlite> 
sqlite> create table test2 (val1 text, val2 numeric);
sqlite>

테이블에 데이터 3개를 저장하도록 하겠다.

insert into test2 values ('Summer', 'Summer');
insert into test2 values (48, 48);
insert into test2 values ('72', '72');
insert into test2 values (39.24, 39.24);
insert into test2 values ('0.17', '0.17');
insert into test2 values (null, null);
sqlite> 
sqlite> insert into test2 values('Summer', 'Summer');
sqlite> insert into test2 values(48, 48);
sqlite> insert into test2 values('72', '72');
sqlite> insert into test2 values(39.24, 39.24);
sqlite> insert into test2 values('0.17', '0.17');
sqlite> insert into test2 values(null, null);
sqlite> 

저장된 데이터와 그 데이터 타입을 조회해 보겠다.

select val1, typeof(val1), val2, typeof(val2) from test2;
sqlite> 
sqlite> select val1, typeof(val1), val2, typeof(val2) from test2;
val1        typeof(val1)  val2        typeof(val2)
----------  ------------  ----------  ------------
Summer      text          Summer      text        
48          text          48          integer     
72          text          72          integer     
39.24       text          39.24       real        
0.17        text          0.17        real        
            null                      null        
sqlite> 

TEXT 타입으로 설정한 컬럼는 TEXT 타입의 값은 그대로 저장되었지만, INTEGER 타입이나 REAL 타입의 값은 TEXT 타입으로 변환되어 저장되었다. NULL 타입의 값은 변환되지 않고 그대로 저장되었다.

NUMERIC 타입을 설정한 컬럼에 TEXT 형태의 값을 저장하면 INTEGER 타입 또는 REAL 타입으로 변환을 시도하여 성공하면 변환 된 값으로 저장되고, 실패하면 TEXT 타입 그대로 저장된다. NULL 타입의 값은 변환되지 않고 그대로 저장된다.

이번에는 TEXT 타입와 NUMERIC 타입만을 시도해 보았다. 컬럼에 데이터 타입을 설정한 경우에는 경우에 따라서는 값의 데이터 타입이 변환되어 저장되어 있는 것을 확인할 수 있었다.

반응형

+ Recent posts