> For the complete documentation index, see [llms.txt](https://docs.tibero.com/tibero-manuals/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tibero.com/tibero-manuals/7.2.6.manuals/development-guide/using-data-types.md).

# 데이터 타입의 사용

애플리케이션에서 사용할 수 있는 Tibero의 데이터 타입을 소개하고, 데이터 타입을 선택하고 변환할 때 고려할 사항을 설명합니다.

## 개요

데이터 타입은 테이블과 같은 스키마 객체를 생성할 때 각 컬럼에 선언하며, 일반적인 클라이언트 프로그램에서도 모든 데이터 타입에 대응되는 변수를 사용할 수 있습니다. 어떤 데이터 타입을 선택하는지에 따라 저장할 수 있는 값의 범위와 크기, 비교나 연산을 수행할 때의 타입 변환 동작이 달라지므로, 애플리케이션을 작성할 때는 저장할 데이터의 성격에 맞는 타입을 선택해야 합니다.

Tibero에서 제공하는 데이터 타입은 다음과 같습니다.

<table><thead><tr><th width="146">구분</th><th width="276">데이터 타입</th><th>설명</th></tr></thead><tbody><tr><td>문자형</td><td><p>CHAR, VARCHAR, VARCHAR2, NCHAR, NVARCHAR,</p><p>NVARCHAR2, RAW, LONG, LONG RAW</p></td><td>문자열이나 바이너리 데이터를 표현하는 데이터 타입</td></tr><tr><td>숫자형</td><td><p>NUMBER, INTEGER, FLOAT,</p><p>BINARY_FLOAT, BINARY_DOUBLE</p></td><td>정수나 실수의 숫자를 저장하는 데이터 타입</td></tr><tr><td>날짜형</td><td><p>DATE, TIME, TIMESTAMP, TIMESTAMP WITH TIME ZONE,</p><p>TIMESTAMP WITH LOCAL TIME ZONE</p></td><td>시간이나 날짜를 저장하는 데이터 타입</td></tr><tr><td>간격형</td><td><p>INTERVAL YEAR TO MONTH,</p><p>INTERVAL DAY TO SECOND</p></td><td>시간 간격을 저장하는 데이터 타입</td></tr><tr><td>대용량 객체형</td><td><p>CLOB, NCLOB, BLOB, XMLTYPE,</p><p>JSON</p></td><td>대용량의 객체를 저장하는 데이터 타입</td></tr><tr><td>내재형</td><td>ROWID</td><td>사용자가 명시적으로 선언하지 않아도 Tibero가 삽입되는 로우마다 자동으로 부여하는 타입</td></tr><tr><td>사용자 정의형</td><td>배열, 네스티드 테이블</td><td>사용자가 정의하여 사용하는 컬렉션 형태의 타입</td></tr></tbody></table>

{% hint style="info" %}
**참고**

각 데이터 타입의 문법과 크기 한도, 타입별 특징에 대한 자세한 내용은 "[Tibero SQL 참조 안내서](/tibero-manuals/7.2.6.manuals/sql-reference-guide.md)"의 [데이터 타입](/tibero-manuals/7.2.6.manuals/sql-reference-guide/sql-elements/data-types.md)을 참고합니다.
{% endhint %}

오브젝트 타입과 컬렉션 타입을 애플리케이션에서 사용하는 방법은 본 안내서의 [오브젝트 타입의 사용](/tibero-manuals/7.2.6.manuals/development-guide/object-type.md)과 [컬렉션 타입의 사용](/tibero-manuals/7.2.6.manuals/development-guide/collection-type.md)에서 설명합니다.

## 데이터 타입 선택 지침

본 절에서는 애플리케이션에서 저장할 데이터의 성격에 따라 어떤 데이터 타입을 선택할지를 설명합니다.

### 문자형

* CHAR 타입은 고정 길이, VARCHAR 타입은 가변 길이 문자열입니다. 선언된 길이보다 짧은 문자열을 저장하면 CHAR 타입은 남은 부분을 공백 문자로 채우고, VARCHAR 타입은 입력된 길이 그대로 저장합니다. 코드 값처럼 길이가 일정한 데이터에는 CHAR 타입을, 길이가 일정하지 않은 일반 문자열에는 VARCHAR 타입을 사용합니다. VARCHAR2 타입은 VARCHAR 타입과 완전히 동일합니다.
* CHAR 타입과 VARCHAR 타입의 길이는 byte 단위(BYTE)나 문자 단위(CHAR)로 지정할 수 있으며, 단위를 생략하면 byte 단위로 지정됩니다. 문자 단위로 선언한 컬럼이 실제로 차지하는 크기는 데이터베이스의 문자 집합에서 한 문자가 몇 byte로 표현되는지에 따라 달라집니다. CHAR 타입은 size 자체를 생략할 수 있으며, 이 경우 길이 1의 고정 길이로 선언됩니다.
* 다국어 문자 집합을 사용하는 문자열은 NCHAR 타입(고정 길이)이나 NVARCHAR 타입(가변 길이)에 저장합니다. 두 타입의 길이는 항상 문자 단위입니다. NVARCHAR2 타입은 NVARCHAR 타입과 완전히 동일합니다.
* 길이가 2,000 byte 이하인 바이너리 데이터는 RAW 타입에, 그보다 큰 바이너리 데이터는 BLOB 타입에 저장합니다.
* LONG 타입과 LONG RAW 타입은 다른 DBMS에서 이식한 소스가 컴파일되도록 제공하는 타입입니다. 새로 작성하는 애플리케이션에서는 LONG 타입 대신 CLOB 타입을, LONG RAW 타입 대신 BLOB 타입을 사용할 것을 권장합니다.

### 숫자형

* NUMBER 타입은 정밀도(precision)와 스케일(scale)로 유효 숫자의 자릿수를 제어하는 타입입니다. 금액처럼 십진 자릿수가 정확하게 유지되어야 하는 값에 사용합니다.
* BINARY\_FLOAT 타입과 BINARY\_DOUBLE 타입은 각각 32비트와 64비트로 저장하는 부동소수점 타입으로, INF, -INF, NaN과 같은 특별값을 지원합니다. 십진 자릿수를 정확히 유지할 필요가 없는 실수 값에 사용할 수 있습니다.
* INTEGER 타입이나 FLOAT 타입으로 컬럼을 선언하면 내부적으로 적절한 정밀도와 스케일을 갖는 NUMBER 타입으로 변환됩니다.
* 서로 다른 숫자형 타입의 값을 하나의 연산에 함께 사용하면 타입의 우선순위에 따라 한쪽 타입으로 변환한 뒤 연산합니다.

### 날짜형과 간격형

* DATE 타입은 연도부터 초 단위까지의 날짜와 시간을 저장합니다. 소수점 이하 초까지 저장해야 하면 TIMESTAMP 타입을, 날짜 없이 시간만 저장하려면 TIME 타입을 사용합니다.
* 값이 만들어진 시간대 정보까지 함께 저장해야 하면 TIMESTAMP WITH TIME ZONE 타입을 사용합니다. 시간대 정보는 저장하지 않되 값을 UTC로 정규화해 저장하고 조회하는 세션의 시간대로 변환해서 보려면 TIMESTAMP WITH LOCAL TIME ZONE 타입을 사용합니다.
* 특정 시점이 아니라 두 시점 사이의 기간을 저장하려면 간격형을 사용합니다. 연도와 월 단위의 간격은 INTERVAL YEAR TO MONTH 타입에, 일·시·분·초 단위의 간격은 INTERVAL DAY TO SECOND 타입에 저장합니다.
* 날짜형과 간격형 타입은 데이터베이스에 고정 길이로 저장됩니다.

### 대용량 객체형

* 문자형에 담을 수 없는 대용량 데이터는 대용량 객체형에 저장합니다. 읽을 수 있는 문자열은 CLOB 타입에, 다국어 문자 집합(National Character Set)을 사용하는 문자열은 NCLOB 타입에, 바이너리 데이터는 BLOB 타입에 저장합니다. 세 타입 모두 8KB 블록을 사용하는 데이터베이스 기준으로 32TB까지 저장할 수 있습니다.
* LONG 타입이나 LONG RAW 타입과 달리 한 테이블에서 여러 컬럼에 선언할 수 있고, 데이터의 임의의 위치에 접근할 수 있습니다.
* XML 데이터는 XMLTYPE 타입에 저장하며, 내부적으로 CLOB 형식으로 저장됩니다. JSON 데이터는 JSON 타입에 저장하며, 내부적으로 BLOB 형식으로 저장됩니다.

## 데이터 타입 변환

컬럼에 다른 타입의 데이터를 저장하거나 서로 다른 타입의 값을 비교·연산하려면 타입 변환이 필요합니다. 타입 변환은 다음의 두 가지 방식으로 이루어집니다.

* 명시적 타입 변환: TO\_CHAR, TO\_NUMBER, TO\_DATE 등의 변환 함수를 사용하여 사용자가 직접 타입을 변환합니다.
* 암시적 타입 변환: 컬럼에 다른 타입의 데이터를 INSERT하거나 UPDATE하는 경우, 조건문에서 비교하는 양쪽 값이 다른 타입인 경우에 Tibero가 자동으로 타입을 변환합니다.

암시적 변환에 의존하면 어느 쪽 값이 어떤 타입으로 변환되는지가 SQL 문장에 드러나지 않으므로, 의도하지 않은 변환으로 결과가 달라질 수 있습니다. 애플리케이션에서는 변환 함수를 사용하여 명시적으로 변환하고, 바인드 변수의 타입을 컬럼의 타입과 일치시킬 것을 권장합니다.

{% hint style="info" %}
**참고**

타입별로 사용할 수 있는 변환 함수와 암시적으로 변환할 수 있는 타입 조합의 전체 목록은 "[Tibero SQL 참조 안내서](/tibero-manuals/7.2.6.manuals/sql-reference-guide.md)"의 [데이터 타입 변환](/tibero-manuals/7.2.6.manuals/sql-reference-guide/sql-elements/data-type-conversion.md)을 참고합니다.
{% endhint %}
