Spanner는 GoogleSQL 및 PostgreSQL 데이터베이스 모두에서 NUMERIC
데이터 유형을 지원합니다.
GoogleSQL NUMERIC
GoogleSQL NUMERIC
은 정밀도가 38이고 소수 자릿수가 9인 정확한 숫자 값을 나타낼 수 있는 정확한 숫자 데이터 유형입니다. 이 페이지에서는 NUMERIC
이 클라이언트 라이브러리에 표시되는 방법을 간략히 설명합니다.
PostgreSQL NUMERIC
PostgreSQL NUMERIC
유형은 최대 정밀도(총 자릿수)가 147,455이고 최대 소수 자릿수(소수점 오른쪽 자릿수)가 16,383인 임의 10진수 정밀도 숫자 데이터 유형입니다.
Spanner DDL에서는 PostgreSQL NUMERIC
열의 정밀도와 소수 자릿수를 지원하지 않습니다. 하지만 DML 문에서 숫자 값을 고정 정밀도 값으로 변환할 수 있습니다. 예를 들면 다음과 같습니다.
update t1 set numeric_column = (numeric_column*0.8)::numeric(5,2);
DECIMAL
유형은 NUMERIC
별칭입니다.
기본 키, 외래 키 또는 보조 색인을 지정할 때는 PostgreSQL NUMERIC
열을 사용할 수 없습니다.
각 클라이언트 라이브러리 언어로 NUMERIC 표시
NUMERIC
값의 충실도가 유지되도록 각 Spanner 클라이언트 라이브러리는 해당 값을 클라이언트 라이브러리 언어의 적절한 데이터 유형에 저장합니다. 다음 표에서는 NUMERIC
이 지원되는 각 언어로 매핑되는 데이터 유형을 보여줍니다.
언어 | GoogleSQL | PostgreSQL |
---|---|---|
C++ | spanner::Numeric | |
C# | SpannerNumeric | |
Go | big.Rat | 커스텀 PGNumeric |
자바 | BigDecimal | 커스텀 유형. PostgreSQL 자바 라이브러리 참고사항을 참조하세요. |
Node.js | 크게 | |
PHP | 커스텀 Numeric | |
Python | 십진수 | 커스텀 주석이 있는 십진수 |
Ruby | BigDecimal |
C++, C#, PHP의 세 가지 클라이언트 라이브러리는 각각 Spanner SQL의 NUMERIC
유형을 나타내는 커스텀 유형을 구현했습니다. 다른 모든 라이브러리는 기존 유형을 사용합니다.
C++ 클라이언트 라이브러리 spanner::Numeric
객체는 산술 작업을 지원하지 않습니다. 대신 포함된 숫자를 원하는 C++ 객체로 변환하세요.
예를 들어 숫자를 문자열로 추출하여 완전 충실도로 데이터 손실 없이 숫자를 나타낼 수 있습니다. 하지만 예를 들어 숫자가 std:int64_t
또는 double
범위 내에 들어간다는 것을 미리 알고 있으며 해당 유형으로 값에 액세스할 수 있습니다.
PostgreSQL 자바 라이브러리 참고사항
Spanner 자바 클라이언트 라이브러리에서는 커스텀 Value.pgNumeric
유형을 사용하여 PostgreSQL NUMERIC 값을 저장합니다.
NUMERIC 열에 쓰기
PostgreSQL 테이블의 NUMERIC 열에 쓸 때 여러 유형이 지원됩니다.
숫자
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23)
정수
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1)
더블
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 1.23::float8)
형식화되지 않은 리터럴
INSERT INTO Table (id, PgNumericColumn) VALUES (1, 'NaN')
매개변수화된 쿼리
매개변수화된 쿼리를 사용하는 경우 $<index>
로 매개변수를 지정합니다. 여기서 <index>
는 매개변수 위치를 나타냅니다. 그런 다음 p<index>
를 사용하여 매개변수를 바인딩해야 합니다. 예를 들어 매개변수가 있는 INSERT INTO MyTable (PgNumericColumn) VALUES ($1)
는 p1
이 됩니다.
Java 클라이언트 라이브러리에서는 다음 유형을 매개변수화된 값으로 지원합니다.
커스텀
Value.pgNumeric
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(Value.pgNumeric("1.23")) .bind("p2") .to(Value.pgNumeric("NaN")) .build()
더블
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1), ($2)") .bind("p1") .to(1.23D) .bind("p2") .to(Double.NaN) .build()
정수
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1) .build()
Longs
Statement .newBuilder("INSERT INTO MyTable (PgNumericColumn) VALUES ($1)") .bind("p1") .to(1L) .build()
변형
변형을 사용할 경우 다음 값을 숫자 유형 열에 쓸 수 있습니다.
문자열
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to("1.23") .build()
BigDecimal 유형의 값
BigDecimals
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(new BigDecimal("1.23")) .build()
Ints
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1) .build()
Longs
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(1L) .build()
Value.pgNumeric을 호출한 결과로 얻은 값
Mutation .newInsertBuilder("MyTable") .set("PgNumericColumn") .to(Value.pgNumeric("1.23")) .build()
NUMERIC 열에서 검색
ResultSet의 숫자 열에 저장된 값을 가져오려면 ResultSet.getString()
또는 ResultSet.getValue()
를 사용합니다.
문자열
resultSet.getString("PgNumericColumn")
커스텀 값
Value pgNumeric = resultSet.getValue("PgNumericColumn"); pgNumeric.getString(); // get underlying value as a String pgNumeric.getNumeric(); // get underlying value as a BigDecimal pgNumeric.getFloat64(); // get underlying value as aDouble
NUMERIC 열 추가
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 Venues
라는 테이블에 NUMERIC
열을 추가하는 방법을 보여줍니다.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC 데이터 업데이트
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 NUMERIC
데이터를 업데이트하는 방법을 보여줍니다.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC 데이터 쿼리
다음 샘플에서는 Spanner 클라이언트 라이브러리를 사용하여 NUMERIC
데이터를 쿼리하는 방법을 보여줍니다.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
NUMERIC
은 자바 BigDecimal 유형을 사용하는 Spanner JDBC 드라이버에서 지원됩니다. NUMERIC
사용 방법에 대한 예시는 GoogleSQL 언어 데이터베이스에 JDBC 연결의 코드 샘플을 참조하세요.
클라이언트 라이브러리나 드라이버를 만들 때 NUMERIC 처리
NUMERIC
유형은 google.protobuf.Value proto에서 10진수 또는 과학 표기법의 문자열로 인코딩됩니다. 이 proto는 읽기 또는 작성 여부에 따라 ResultSet, PartialResultSet 또는 Mutation으로 래핑됩니다. ResultSetMetadata는 NUMERIC TypeCode를 사용하여 해당 값을 NUMERIC
으로 읽어야 함을 나타냅니다.
생성한 클라이언트 라이브러리 또는 드라이버에서 NUMERIC으로 작업할 때는 다음 안내를 따르세요.
ResultSet에서
NUMERIC
을 읽으려면 다음 안내를 따르세요.TypeCode가
NUMERIC
인 경우 google.protobuf.Value proto에서 string_value를 읽습니다.문자열을 지정된 언어의 관련 유형으로 변환합니다.
Mutation을 사용하여
NUMERIC
을 작성하려면 관련 유형이 주어졌을 때 google.protobuf.Value proto에서 string_value로 문자열 표현을 사용합니다.