---
title: typesql 타입
description: typesql의 스칼라, 복합, JSON, 테이블, null 허용성, 마스킹 타입을 참고합니다.
species: reference
---
# typesql 타입

typesql은 레이크의 물리적 타입을 반영하고 표현식 전용 복합 타입을 추가합니다. 타입은 값을 설명하며 그 값을 바꾸지 않습니다.

## 스칼라 타입

| 타입 | 의미 |
|---|---|
| `boolean` | `true` 또는 `false` |
| `integer` | 부호 있는 64비트 정수 |
| `decimal(p, s)` | 최대 정밀도 38의 정확한 십진수 |
| `float` | 64비트 부동소수점 값 |
| `date` | 달력 날짜 |
| `datetime` | 오프셋 없는 타임스탬프. 마이크로초 정밀도로 저장 |
| `datetimetz` | 특정 시점. 마이크로초 정밀도로 저장 |
| `string` | UTF-8 텍스트 |
| `json` | 구조가 선언되지 않은 JSON |
| `binary` | 표준 base64 텍스트로 전달되는 이진 값 |

`unknown`은 검사기에 근거가 충분하지 않음을 뜻합니다. `never`는 값을 생성할 수 없는 경로를 나타냅니다.

## null 허용성

카탈로그가 현재 유효한 반대 근거를 제공하지 않으면 레이크 값은 null을 허용합니다. 뒤에 붙는 `!`는 null이 아닌 값을 요구합니다.

```typesql
select id satisfies string!
from titan.stripe.customers
where id is not null
```

`is not null` 같은 조건은 유효한 흐름 범위 안에서 값의 타입을 좁힙니다. 형 변환만으로는 결과가 null이 아님을 입증하지 못합니다.

## 복합 타입

표현식에서 사용하는 컬렉션은 `list<T>`, `struct{field: T}`, `map<K, V>`를 사용합니다. 테이블 구조는 순서가 있는 열에 이름을 붙입니다.

```typesql
with customer_totals(customer_id: string!, revenue: decimal(18, 2)) as (
  select customer, sum(amount) / 100.0
  from titan.stripe.charges
  group by customer
)
select * from customer_totals
```

## 구조가 지정된 JSON

`json<{...}>`은 런타임 표현을 유지하면서 JSON 값 안에서 사용할 수 있는 필드를 설명합니다.

```typesql
select metadata satisfies json<{campaign: string, cohort: string}>
from titan.stripe.customers
```

커넥터 구조 패키지는 이러한 구조를 이름으로 제공할 수 있으므로 쿼리마다 반복할 필요가 없습니다.

## 마스킹 타입

`masked<T>`는 열 정책의 출처 정보를 기록합니다. 형 변환으로 제거하거나 일반 값처럼 비교하거나 마스킹되지 않은 분기와 합칠 수 없습니다. 실패 시 형 변환은 `TS0410`, 비교는 `TS0411`, 안전하지 않은 흐름은 `TS0412`를 사용합니다. 호환되는 투영과 `union all`은 래퍼를 유지합니다.
