타입 변환
uint32는 UInt64 컬럼의 데이터를 받는 데 사용할 수 없습니다. 반대로 문자열은 포맷 요구 사항을 충족하면 datetime64 필드에 삽입할 수 있습니다.
현재 Primitive 타입에 대해 지원되는 타입 변환은 여기에 정리되어 있습니다.
이 작업은 현재도 진행 중이며, 삽입(Append/AppendRow)과 읽기 시점(Scan 사용)으로 나눌 수 있습니다. 특정 변환 지원이 필요하면 이슈를 등록해 주십시오.
표준 database/sql 인터페이스는 ClickHouse API와 동일한 타입을 지원해야 합니다. 몇 가지 예외가 있으며, 주로 복합 타입과 관련된 내용으로 아래 섹션에 설명되어 있습니다. ClickHouse API와 마찬가지로, 클라이언트는 삽입과 응답 마샬링 모두에서 변수 타입을 가능한 한 유연하게 받아들이는 것을 목표로 합니다.
복합 타입
Date/DateTime
Date, Date32, DateTime, DateTime64 날짜/날짜-시간 타입을 지원합니다. Date는 2006-01-02 포맷의 문자열로 삽입하거나 네이티브 Go time.Time{} 또는 sql.NullTime을 사용해 삽입할 수 있습니다. DateTime도 마찬가지로 후자의 타입을 지원하지만, 문자열은 선택적 시간대 오프셋(예: 2006-01-02 15:04:05 +08:00)과 함께 2006-01-02 15:04:05 포맷으로 전달해야 합니다. time.Time{}와 sql.NullTime은 읽기 시점에도 지원되며, sql.Scanner interface를 구현한 모든 타입도 지원됩니다.
시간대 정보 처리 방식은 ClickHouse 타입과 값이 삽입되는지 읽히는지에 따라 달라집니다.
- DateTime/DateTime64
- 삽입 시 값은 UNIX timestamp 포맷으로 ClickHouse에 전송됩니다. 시간대가 지정되지 않으면 클라이언트는 자체 로컬 시간대를 사용합니다.
time.Time{}또는sql.NullTime도 이에 맞춰 epoch로 변환됩니다. - select 시
time.Time값을 반환할 때 컬럼에 시간대가 설정되어 있으면 해당 시간대가 사용됩니다. 그렇지 않으면 server의 시간대가 사용됩니다.
- 삽입 시 값은 UNIX timestamp 포맷으로 ClickHouse에 전송됩니다. 시간대가 지정되지 않으면 클라이언트는 자체 로컬 시간대를 사용합니다.
- Date/Date32
- 삽입 시 날짜를 unix timestamp로 변환할 때 해당 날짜의 시간대가 고려됩니다. 즉 Date 타입은 ClickHouse에서 locale 정보를 갖지 않으므로, 날짜로 저장되기 전에 시간대에 따른 오프셋이 적용됩니다. 문자열 값에 이 정보가 지정되지 않으면 로컬 시간대가 사용됩니다.
- select 시 날짜를
time.Time{}또는sql.NullTime{}인스턴스로 스캔하면 시간대 정보 없이 반환됩니다.
Time/Time64 타입
Time 및 Time64 컬럼 타입은 날짜 component 없이 하루 중 시간을 저장합니다. 둘 다 Go의 time.Duration에 매핑됩니다.
Time은 시간을 초 단위 정밀도로 저장합니다.Time64(precision)은DateTime64와 마찬가지로 sub-second precision을 지원하며, precision은 0–9입니다.
배열
맵
database/sql API를 사용할 때는 Map 값의 타입이 엄격하게 맞아야 하므로 값 타입으로 interface{}를 사용할 수 없습니다. 예를 들어 Map(String,String) 필드에는 map[string]interface{}를 전달할 수 없고, 대신 map[string]string을 사용해야 합니다. interface{} 변수는 항상 호환되므로 더 복잡한 구조를 다룰 때 사용할 수 있습니다.전체 예시튜플
Nested
map[string]interface{} 유형이어야 합니다. 현재 값에는 엄격한 타입이 적용되지 않습니다.
flatten_tested=0
flatten_nested에 기본값인 1을 사용하면 중첩 컬럼이 별도의 배열로 평탄화됩니다. 이 경우 삽입 및 조회 시 중첩 슬라이스를 사용해야 합니다. 임의 수준의 중첩도 동작할 수 있지만, 공식적으로 지원되지는 않습니다.
flatten_nested=1
참고: Nested 컬럼은 차원이 서로 같아야 합니다. 예를 들어, 위 예시에서 Col_2_2와 Col_2_1은 동일한 수의 요소를 가져야 합니다.
인터페이스가 더 단순하고 중첩을 공식적으로 지원하므로, flatten_nested=0을 권장합니다.
Geo 타입
UUID
sql.Scanner 또는 Stringify를 구현하는 모든 유형으로도 전송 및 마샬링할 수 있습니다.
Decimal
서드파티 의존성을 피하기 위해 대신 Float를 사용하고 싶을 수 있습니다. 하지만 정확한 값이 필요한 경우 ClickHouse에서 Float 타입은 권장되지 않음에 유의하십시오.그래도 클라이언트 측에서 Go의 내장 Float 타입을 사용하기로 했다면, ClickHouse 쿼리에서 toFloat64() 함수 또는 해당 변형 함수를 사용해 Decimal을 Float로 명시적으로 변환해야 합니다. 이 변환으로 인해 정밀도가 손실될 수 있다는 점에 유의하십시오.
널 허용
sql.NullInt64와 같은 sql.Null* 타입도 지원합니다. 이러한 타입은 대응되는 ClickHouse 타입과 호환됩니다.
큰 정수
BFloat16
BFloat16은 머신 러닝 워크로드에 사용되는 16비트 brain float 유형입니다. Go에서는 BFloat16 값이 float32로 삽입되고 스캔됩니다. 널 허용 변형에는 sql.NullFloat64를 사용합니다.
QBit
QBit은 벡터 유사도 검색에 최적화된, 비트 슬라이스 형식으로 벡터 임베딩을 저장하는 실험적 컬럼 유형입니다. 사용하려면 allow_experimental_qbit_type 설정을 활성화해야 합니다.
Go에서는 QBit(Float32, N) 컬럼에 []float32로 데이터를 삽입하고 []float32로 스캔하며, 여기서 N은 벡터의 차원입니다.