데이터 유형

Cloud Spanner는 정수와 같은 간단한 데이터 유형뿐만 아니라 ARRAY 및 STRUCT와 같은 보다 복잡한 유형도 지원합니다. 이 페이지는 허용 값을 포함하여 각 데이터 유형의 개요를 설명합니다.

열 값의 최대 크기는 10MiB이며 스칼라형과 배열형에 적용됩니다.

허용되는 유형

유형 이름 유효한 열 유형? 유효한 키 열 유형? 1 유효한 SQL 유형? 스토리지 크기2
ARRAY 아니요 요소 크기의 합
BOOL 1바이트
BYTES 바이트 수
DATE 4바이트
FLOAT64 8바이트
INT64 8바이트
STRING UTF-8 인코딩 기준 바이트 수
STRUCT 아니요 아니요 해당 없음
TIMESTAMP 12바이트

1 기본 키, 외래 키, 보조 색인
2 각 셀에는 나열된 값 외에도 8바이트의 스토리지 오버헤드가 있습니다.

데이터 유형 속성

데이터를 저장하고 쿼리할 때 다음 데이터 유형 속성에 유의하는 것이 좋습니다.

속성 설명 적용 대상
Nullable NULL이 유효한 값입니다. 모든 데이터 유형
Orderable ORDER BY 절에 사용될 수 있습니다. 다음을 제외한 모든 데이터 유형:
  • ARRAY
  • STRUCT
Groupable 일반적으로 GROUP BYDISTINCT 뒤의
표현식에서 나타날 수 있습니다.
다음을 제외한 모든 데이터 유형:
  • ARRAY
  • STRUCT
Comparable 동일한 유형의 값을 서로 비교할 수 있습니다. 다음을 제외한 모든 데이터 유형: ARRAY 비교는 지원되지 않습니다.

STRUCT에 대한 같음 비교는 필드 순서에 따라 필드별로 지원됩니다. 필드 이름은 무시됩니다. 보다 작음 및 보다 큼 비교는 지원되지 않습니다.

비교를 지원하는 모든 유형을 JOIN 조건에서 사용할 수 있습니다. 조인 조건에 대한 설명은 JOIN 유형을 참조하세요.

숫자 유형

숫자형에는 정수형과 부동 소수점형이 있습니다.

정수형

정수는 소수 구성요소가 없는 숫자 값입니다.

이름 범위
INT64 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

부동 소수점형

부동 소수점 값은 소수 부분을 갖는 근사적 숫자 값입니다.

이름 설명
FLOAT64 배정밀도(근사) 십진수 값

부동 소수점 시맨틱스

부동 소수점 숫자를 다룰 때는 숫자가 아닌 특수 값인 NaN+/-inf를 고려해야 합니다.

Cloud Spanner REST 및 RPC API를 사용할 때는 TypeCode(REST)TypeCode(RPC)의 설명과 같이 부동 소수점 특수 값을 Infinity, -Infinity, NaN 형식으로 지정해야 합니다. Cloud Spanner REST API 및 RPC API에서는 +inf, -inf, nan 리터럴이 지원되지 않습니다.

산술 연산자는 유한 출력을 생성하는 모든 유한 입력 값과 최소한 한 개 이상의 입력이 무한인 모든 연산에 대해 표준 IEEE-754 동작을 제공합니다.

입력은 유한이지만 출력이 무한인 경우 함수 호출 및 연산자는 오버플로 오류를 반환합니다. 입력에 무한 값이 포함되어 있으면 출력이 무한일 수 있습니다. 일반적으로 함수는 NaN 또는 +/-inf를 발생시키지 않습니다. 그러나 IEEE_DIVIDE와 같은 특정 함수는 유한 입력에 대해 무한 값을 반환할 수 있습니다. 이러한 모든 경우는 수학 함수에 명시적으로 기술되어 있습니다.

수학 함수 예시
좌항 연산자 우항 반환
모든 값 + NaN NaN
1.0 + +inf +inf
1.0 + -inf -inf
-inf + +inf NaN
최대 FLOAT64 + 최대 FLOAT64 오버플로 오류
최소 FLOAT64 / 2.0 0.0
1.0 / 0.0 '0으로 나누기' 오류

비교 연산자는 부동 소수점 입력에 표준 IEEE-754 동작을 제공합니다.

비교 연산자 예시
좌항 연산자 우항 반환
NaN = 모든 값 FALSE
NaN < 모든 값 FALSE
모든 값 < NaN FALSE
-0.0 = 0.0 TRUE
-0.0 < 0.0 FALSE

부동 소수점 값은 가장 작은 값부터 가장 큰 값까지 다음 순서로 정렬됩니다.

  1. NULL
  2. NaN — 정렬 시 모든 NaN 값은 같은 값으로 간주됩니다.
  3. -inf
  4. 음수
  5. 0 또는 -0 — 정렬 시 모든 0 값은 같은 값으로 간주됩니다.
  6. 양수
  7. +inf

특수 부동 소수점 값은 GROUP BY 절에 의한 그룹화와 DISTINCT 키워드에 의한 그룹화를 포함하여 다음과 같이 그룹화됩니다.

  • NULL
  • NaN — 그룹화 시 모든 NaN 값은 같은 값으로 간주됩니다.
  • -inf
  • 0 또는 -0 — 그룹화 시 모든 0 값은 같은 값으로 간주됩니다.
  • +inf

부울 유형

이름 설명
BOOL 부울 값은 TRUEFALSE 키워드로 표시됩니다(대소문자를 구분하지 않음).

문자열 유형

이름 설명
STRING 가변 길이 문자(Unicode) 데이터

입력 STRING 값은 UTF-8로 인코딩되어야 하고, 출력 STRING 값은 UTF-8로 인코딩됩니다. CESU-8, Modified UTF-8과 같은 다른 인코딩은 유효한 UTF-8으로 처리되지 않습니다.

STRING 값을 대상으로 하는 모든 함수와 연산자는 바이트가 아닌 유니코드 문자를 대상으로 작동합니다. 예를 들어 STRING 입력에 적용된 SUBSTRLENGTH 같은 함수는 바이트가 아닌 문자 수를 계산합니다.

각 유니코드 문자에는 할당된 코드 포인트라는 숫자 값이 있습니다. 하위 코드 포인트는 하위 문자에 할당됩니다. 문자를 비교할 때 코드 포인트는 다른 문자보다 작거나 큰 문자를 결정합니다.

대부분의 STRING 관련 함수는 BYTES로도 정의됩니다. BYTES 버전은 유니코드 문자가 아닌 원시 바이트를 대상으로 작동합니다. STRING과 BYTES는 서로 바꿔서 사용할 수 없는 별도의 유형입니다. 어느 방향으로도 암시적 변환이 수행되지 않습니다. STRING과 BYTES 간의 명시적 변환은 UTF-8 인코딩과 디코딩을 수행합니다. 바이트가 유효한 UTF-8이 아닌 경우 BYTES를 STRING으로 변환하면 오류가 반환됩니다.

바이트 유형

이름 설명
BYTES 가변 길이 바이너리 데이터

STRING과 BYTES는 서로 바꿔서 사용할 수 없는 별도의 유형입니다. 대부분의 STRING 관련 함수는 BYTES로도 정의됩니다. BYTES 버전은 유니코드 문자가 아닌 원시 바이트를 대상으로 작동합니다. STRING과 BYTES를 상호 변환하면 바이트가 UTF-8로 인코딩됩니다.

날짜 유형

이름 범위
DATE 0001-01-01 ~ 9999-12-31.

DATE 유형은 시간대와 관계없이 논리적 달력 날짜를 나타냅니다. DATE 값은 특정 24시간 기간을 나타내지 않습니다. 그 대신 주어진 DATE 값은 다른 시간대에서 해석될 때 다른 24시간 기간을 나타내며, 일광 절약 시간 전환 중에는 더 짧거나 긴 하루를 나타낼 수 있습니다. 절대 시간을 표시하려면 타임스탬프를 사용합니다.

정규 형식
'YYYY-[M]M-[D]D'
  • YYYY: 4자리 연도
  • [M]M: 한 자리 또는 두 자리 월
  • [D]D: 한 자리 또는 두 자리 일

타임스탬프 유형

이름 범위
TIMESTAMP 0001-01-01 00:00:00 ~ 9999-12-31 23:59:59.999999999 UTC

TIMESTAMP 객체는 나노초 단위의 정밀도를 가진 일광 절약 시간과 같은 시간대 또는 규칙과 관계없이 절대 시점을 나타냅니다.

  • 달력에 표시되는 날짜를 나타내려면 DATE 객체를 사용합니다.
정규형

Rest API와 RPC API의 경우

TypeCode(RPC)TypeCode(REST)에서 설명하는 규칙에 따라 JSON 값으로 인코딩하거나 JSON 값을 디코딩합니다. 특히, 타임스탬프 값이 Zulu 시간(UTC-0)을 나타내는 대문자 리터럴 'Z'로 끝나야 합니다.

예를 들면 다음과 같습니다.

2014-09-27T12:30:00.45Z

타임스탬프 값은 Zulu 시간으로 표현되어야 하며 UTC 오프셋을 포함할 수 없습니다. 예를 들어 다음과 같은 타임스탬프는 지원되지 않습니다.

-- NOT SUPPORTED! TIMESTAMPS CANNOT INCLUDE A UTC OFFSET WHEN USED WITH THE REST AND RPC APIS
2014-09-27 12:30:00.45-8:00

클라이언트 라이브러리의 경우

언어별 타임스탬프 형식을 사용합니다.

SQL 쿼리의 경우

YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDDDDD]][time zone]
  • YYYY: 4자리 연도
  • [M]M: 한 자리 또는 두 자리 월
  • [D]D: 한 자리 또는 두 자리 일
  • ( |T): 공백 또는 `T` 구분선
  • [H]H: 한 자리 또는 두 자리 시간(유효 값: 00~23)
  • [M]M: 한 자리 또는 두 자리 분(유효 값: 00~59)
  • [S]S: 한 자리 또는 두 자리 초(유효 값: 00~59)
  • [.DDDDDDDDD]: 소수점 아래 최대 9자리(나노초 정밀도)
  • [time zone]: 시간대를 나타내는 문자열. 시간대가 명시적으로 지정되지 않은 경우 기본 시간대인 America/Los_Angeles가 사용됩니다. 자세한 내용은 시간대 섹션을 참조하세요.

시간대

시간대는 타임스탬프를 파싱하거나 표시할 타임스탬프 형식을 지정하는 데 사용됩니다. 타임스탬프 값 자체는 특정 시간대를 저장하지 않으며 시차를 적용해도 변경되지 않습니다.

시간대는 다음 두 정규 형식 중 하나인 문자열로 표현됩니다.

  • 협정 세계시(UTC) 기준 오프셋 또는 UTC를 나타내는 문자인 Z
  • tz 데이터베이스에 등록된 시간대 이름

협정 세계시(UTC) 기준 오프셋

(+|-)H[H][:M[M]]
Z

예시

-08:00
-8:15
+3:00
+07:30
-7
Z

이 형식을 사용할 때는 시간대와 나머지 타임스탬프 사이에 공백이 없어야 합니다.

2014-09-27 12:30:00.45-8:00
2014-09-27T12:30:00.45Z

시간대 이름

continent/[region/]city

시간대 이름은 tz 데이터베이스에서 가져옵니다. 이보다는 덜 포괄적이지만 더 간단한 참고자료를 원한다면 Wikipedia의 tz 데이터베이스 시간대 목록을 참조하세요.

예시

America/Los_Angeles
America/Argentina/Buenos_Aires

시간대 이름을 사용할 때는 이름과 나머지 타임스탬프 사이에 공백이 있어야 합니다.

2014-09-27 12:30:00.45 America/Los_Angeles

1년 중 특정 시기에 우연히 시간이 같더라도 시간대 이름을 엄밀히 구분해야 할 수 있습니다. 예를 들어 America/Los_Angeles는 일광 절약 시간 동안 UTC-7:00과 같은 시간을 보고하지만, 일광 절약 시간이 아닐 때는 UTC-8:00과 같은 시간을 보고합니다.

시간대를 지정하지 않으면 기본 시간대 값이 사용됩니다.

윤초

타임스탬프는 1분이 정확히 60초라는 가정 하에 1970-01-01 00:00:00 UTC부터 경과된 오프셋입니다. 윤초는 저장된 타임스탬프의 일부로 표현되지 않습니다.

입력 값의 초 필드에 윤초를 나타내는 ':60'이 포함되어 있으면 타임스탬프 값으로 변환할 때 윤초가 보존되지 않습니다. 대신 해당 값은 1분 후의 초 필드에 ':00'이 있는 타임스탬프로 해석됩니다.

윤초는 타임스탬프 계산에 영향을 주지 않습니다. 모든 타임스탬프는 윤초를 반영하지 않는 Unix 형식의 타임스탬프를 사용하여 계산됩니다. 실제 시간을 측정하는 함수를 통해서만 윤초를 확인할 수 있습니다. 이러한 함수에서는 윤초가 있는 경우 타임스탬프 초가 건너뛰기 또는 되풀이될 수 있습니다.

배열 유형

이름 설명
ARRAY 유형이 ARRAY가 아닌 요소가 0개 이상 있는 순서가 지정된 목록

ARRAY는 값이 ARRAY가 아닌 요소가 0개 이상 있는 순서가 지정된 목록입니다. ARRAY의 ARRAY는 허용되지 않습니다. 쿼리에서 ARRAY의 ARRAY가 생성될 경우 오류가 반환됩니다. 대신 SELECT AS STRUCT 구문을 사용하여 STRUCT를 ARRAY 사이에 삽입해야 합니다.

빈 ARRAY와 NULL ARRAY는 서로 구분되는 값입니다. ARRAY는 NULL 요소를 포함할 수 있습니다.

ARRAY 유형 선언

ARRAY<T>

ARRAY 유형은 꺾쇠괄호(<>)를 사용하여 선언됩니다. ARRAY의 요소 유형은 임의로 복합적일 수 있지만, ARRAY가 다른 ARRAY를 직접 포함할 수는 없습니다.

예시

유형 선언 의미
ARRAY<INT64> 64비트 정수로 이루어진 단순 ARRAY입니다.
ARRAY<STRUCT<INT64, INT64>> 각각 두 개의 64비트 정수를 포함하는 STRUCT로 이루어진 ARRAY입니다.
참고: STRUCT 값으로 이루어진 ARRAY는 SQL 표현식으로 생성될 수 있지만 열 유형으로 지원되지 않습니다.
ARRAY<ARRAY<INT64>>
(지원되지 않음)
다중 수준 ARRAY를 만들 수 없다는 점을 명시하기 위해 포함된 잘못된 유형 선언입니다. ARRAY는 ARRAY를 직접 포함할 수 없습니다. 대신 다음 예시를 참조하세요.
ARRAY<STRUCT<ARRAY<INT64>>> 64비트 정수로 이루어진 ARRAY로 이루어진 ARRAY입니다. ARRAY가 다른 ARRAY를 직접 포함할 수 없으므로 두 ARRAY 사이에 STRUCT가 있습니다.
참고: STRUCT 값으로 이루어진 ARRAY는 SQL 표현식으로 생성될 수 있지만 열 유형으로 지원되지 않습니다.

구조체 유형

SELECT서브 쿼리에서 STRUCT를 사용하는 방법에 대한 자세한 내용은 쿼리 구문 페이지를 참조하세요.

이름 설명
STRUCT 각각 유형(필수)과 필드 이름(선택사항)이 있는 순서가 지정된 필드의 컨테이너

STRUCT 유형 선언

STRUCT<T>

STRUCT 유형은 꺾쇠괄호(<>)를 사용하여 선언됩니다. STRUCT의 요소 유형은 임의로 복합적일 수 있습니다.

참고: STRUCT 값은 SQL 표현식으로 생성될 수 있지만 열 유형으로 지원되지 않습니다.

유형 선언 의미
STRUCT<INT64> 명명되지 않은 64비트 정수 필드가 하나 있는 단순 STRUCT입니다.
STRUCT<x STRUCT<y INT64, z INT64>> x라는 중첩된 STRUCT를 포함하는 STRUCT입니다. STRUCT x에는 64비트 정수인 yz라는 두 개의 필드가 있습니다.
STRUCT<inner_array ARRAY<INT64>> 64비트 정수 요소를 갖는 inner_array라는 ARRAY가 포함된 STRUCT입니다.

STRUCT 생성

튜플 구문

(expr1, expr2 [, ... ])

출력 유형은 입력 표현식 유형과 일치하는 익명 필드가 있는 익명 STRUCT 유형입니다. 표현식을 최소한 두 개 이상 지정해야 합니다. 그렇지 않으면 이 구문을 괄호로 묶인 표현식과 구분할 수 없습니다.

예시

구문 출력 유형 참고
(x, x+y) STRUCT<?,?> 열 이름을 사용하는 경우(따옴표로 묶이지 않은 문자열), STRUCT 필드 데이터 유형은 열 데이터 유형에서 파생됩니다. xy는 열이므로, STRUCT 필드의 데이터 유형은 더하기 연산자의 출력 유형과 열 유형에서 파생됩니다.

WHERE 절 등에서 복합 키를 사용하는 비교 표현식을 위해 이 구문을 STRUCT 비교와 함께 사용할 수도 있습니다.

WHERE (Key1,Key2) IN ( (12,34), (56,78) )

유형이 없는 구조체 구문

STRUCT( expr1 [AS field_name] [, ... ])

필드 이름 중복이 허용됩니다. 이름이 없는 필드는 익명 필드로 간주되고 이름으로 참조될 수 없습니다. STRUCT 값은 NULL이거나 NULL 필드 값일 수 있습니다.

예시

구문 출력 유형
STRUCT(1,2,3) STRUCT<int64,int64,int64>
STRUCT() STRUCT<>
STRUCT('abc') STRUCT<string>
STRUCT(1, t.str_col) STRUCT<int64, str_col string>
STRUCT(1 AS a, 'abc' AS b) STRUCT<a int64, b string>
STRUCT(str_col AS abc) STRUCT<abc string>

유형 구조체 구문

STRUCT<[field_name] field_type, ...>( expr1 [, ... ])

유형 구문을 사용하면 명시적인 STRUCT 데이터 유형으로 STRUCT를 생성할 수 있습니다. 출력 유형은 정확히 제공된 field_type입니다. 두 유형이 다르면 입력 표현식은 field_type으로 강제 변환되며, 유형이 호환되지 않으면 오류가 발생합니다. 입력 표현식에서 AS alias는 허용되지 않습니다. 표현식 수가 유형의 필드 수와 일치해야 하며, 표현식 유형은 필드 유형으로 강제 변환 또는 리터럴 강제 변환되어야 합니다.

예시

구문 출력 유형
STRUCT<int64>(5) STRUCT<int64>
STRUCT<date>("2011-05-05") STRUCT<date>
STRUCT<x int64, y string>(1, t.str_col) STRUCT<x int64, y string>
STRUCT<int64>(int_col) STRUCT<int64>
STRUCT<x int64>(5 AS x) 오류 - 유형 구문은 AS를 허용하지 않습니다.

STRUCT에 대한 제한적 비교

같음 연산자를 사용하여 STRUCT를 직접 비교할 수 있습니다.

  • 같음(=)
  • 같지 않음(!= 또는 <>)
  • [NOT] IN

그러나 이러한 직접 같음 비교는 STRUCT의 필드를 순서에 따라 쌍으로 비교하며, 필드 이름은 무시됩니다. STRUCT에서 이름이 같은 필드를 비교하려는 경우에는 개별 필드를 직접 비교할 수 있습니다.