이 페이지에서는 Spanner를 사용할 때 JSONB
데이터 유형을 사용하는 방법을 설명합니다.
JSONB
는 Spanner PostgreSQL 언어의 반구조화된 데이터를 보관하는 데 사용되는 PostgreSQL 데이터 유형입니다. JSONB
에는 RFC 7159에 설명된 사양을 따르는 JSON(JavaScript 객체 표기법) 형식의 데이터가 저장됩니다.
사양
Spanner JSONB
데이터 유형은 입력 문서의 정규화된 표현을 저장합니다. 이는 다음을 의미합니다.
- 따옴표와 공백 문자는 유지되지 않습니다.
- 주석은 지원되지 않습니다. 주석이 있는 트랜잭션이나 쿼리는 실패합니다.
- 객체 키는 먼저 키 길이별로 정렬된 후 해당 객체 키 길이에 따라 사전순으로 정렬됩니다. 중복된 객체 키가 있으면 마지막 객체 키만 보존됩니다.
- 기본 유형(
string
,boolean
,number
,null
)에는 유형과 값이 보존됩니다.string
유형 값은 정확하게 보존됩니다.- 후행 0은 유지됩니다.
number
유형 값의 출력 형식에서는 과학적 표기법을 사용하지 않습니다.
JSONB
null
값은NULL
이 아닌 SQL로 처리됩니다. 예를 들면 다음과 같습니다.SELECT null::jsonb IS NULL; -- Returns true SELECT 'null'::jsonb IS NULL; -- Returns false SELECT '{"a":null}'::jsonb -> 'a' IS NULL; -- Returns false SELECT '{"a":null}'::jsonb -> 'b' IS NULL; -- Returns true SELECT '{"a":null}'::jsonb -> 'a'; -- Returns a JSONB 'null' SELECT '{"a":null}'::jsonb -> 'b'; -- Returns a SQL NULL
JSONB 배열 요소 순서는 유지됩니다.
제한사항
Spanner JSONB
에는 다음 제한사항이 적용됩니다.
- Spanner에서 지원하는 PostgreSQL 데이터 유형에서만
to_jsonb
함수의 인수를 가져올 수 있습니다. - 숫자 유형 값은 소수점 이하 4,932자리, 소수점 이후 16,383자리를 가질 수 있습니다.
- 정규화된 스토리지 형식의 최대 허용 크기는 10MB입니다.
JSONB
문서는 UTF-8로 인코딩되어야 합니다. 다른 형식으로 인코딩된JSONB
문서를 사용하는 트랜잭션이나 쿼리는 오류를 반환합니다.
JSONB 열이 있는 테이블 만들기
테이블을 만들 때 테이블에 JSONB
열을 추가할 수 있습니다.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
샘플 VenueFeatures
JSONB
객체는 다음과 같습니다.
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
기존 테이블에서 JSONB 열 추가 및 삭제
다음과 같이 ALTER
문을 사용하여 JSONB
열을 추가하고 삭제할 수 있습니다.
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 Venues
테이블에 VenueDetails
라는 JSONB
열을 추가하는 방법을 보여줍니다.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
JSONB 데이터 수정
다른 열과 마찬가지로 JSONB
열을 수정할 수 있습니다.
예시는 다음과 같습니다.
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 JSONB
데이터를 업데이트하는 방법을 보여줍니다.
C++
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
C#
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Go
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
PHP
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Python
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Ruby
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
JSONB 데이터 쿼리
기본 필드 값을 기준으로 JSONB
열을 쿼리할 수 있습니다. 다음 예시에서는 Venues
에서 VenueId
및 VenueName
을 추출합니다. 여기에서 VenueFeatures
에는 3.5
보다 큰 rating
값이 있습니다.
SELECT VenueId, VenueName FROM Venues WHERE (VenueFeatures->>'rating')::FLOAT8 > 3.5;
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 JSONB
데이터를 쿼리하는 방법을 보여줍니다.
C++
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
C#
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Go
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Java
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Node.js
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
PHP
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Python
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
Ruby
Spanner용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Spanner 클라이언트 라이브러리를 참조하세요.
Spanner에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.
지원되지 않는 PostgreSQL JSONB 기능
Spanner JSONB
에서는 다음 PostgreSQL JSONB
기능이 지원되지 않습니다.
- 정렬, 비교, 집계
- PrimaryKey 및 ForeignKey
- GIN 색인을 포함한 색인 생성 자세한 내용은 색인 생성을 참조하세요.
JSONB
열을 다른 데이터 유형과 변경- PostgreSQL 유선 프로토콜을 사용하는 도구에서 형식화되지 않은 JSONB 매개변수로 매개변수화된 쿼리 사용
쿼리 엔진의 강제 변환. 표준 PostgreSQL과 달리
JSONB
에서 텍스트로 강제 변환될 수 없습니다. 유효한JSON
문자열만 함수 서명과 일치하도록JSONB
유형으로 변환됩니다. 예를 들면 다음과 같습니다.SELECT concat('abc'::text, '{"key1":1}'::jsonb); -- Returns error SELECT concat('abc'::text, CAST('{"key1":1}'::jsonb AS TEXT)); -- This works
색인 생성
JSONB
열에서는 색인을 생성할 수 없습니다. 하지만 생성 열에 색인을 만들어 JSONB
열에서 스칼라 값을 추출할 수 있습니다.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
TotalCapacity BIGINT GENERATED ALWAYS AS ((VenueFeatures->>'capacity')::BIGINT) STORED,
DateOpened TIMESTAMPTZ
);
CREATE INDEX VenuesByCapacity ON Venues(TotalCapacity);