OBKV-Tableはテーブルモデルインターフェースを提供しており、概念定義がSQLに近いため、データ型の概念も存在します。このドキュメントでは、OBKV-Tableがサポートするデータ型について説明します。
OBKVがサポートするデータ型(スキーマ定義)
String型
OBKV-TableがサポートするString型は以下のとおりです:
- Varchar, Char
- Tiny Text, Text, Medium Text, Long Text
注意点として、OBKVクライアントには文字セットを設定するインターフェースがないため、クライアント側のデータはデフォルトでutf8mb4_general_ci文字セットに変換されます。スキーマで定義されている文字セットが異なる場合、保存時に追加の文字セット変換オーバーヘッドが発生します。
Binary型
Binary型はString型に似ていますが、文字列ではなくバイナリデータを格納する点が異なります。
OBKV-TableがサポートするBinary型は以下のとおりです:
- VarBinary, Binary
- Tiny Blob, Blob, Medium Blob, Long Blob
数値型
OBKV-Tableがサポートする数値型は以下のとおりです:
- 整数型:Bool / Boolean / TinyInt / SmallInt / MediumInt / Int / Integer / BigInt
- 固定小数点数:Decimal / Numeric
- 浮動小数点数:Float / Double
注意点:
- OBKV-Tableが主にサポートするクライアントはJavaクライアントです。Javaはunsigned型をサポートしていないため、スキーマ定義においてunsigned属性の存在は許可されません。
- 固定小数点数および浮動小数点数の精度(Precision)と小数桁数(Scale)はすべてスキーマ定義に基づきます。データとスキーマが一致しない場合、エラーが発生します。
日付・時刻型
OBKV-Tableがサポートする日付・時刻型は、Date / Time / DateTime / Timestamp / Yearです。
DateTime / Timestampのデフォルトの精度は0で、秒単位の値を格納します。Javaの関数などが返すミリ秒単位の値をそのまま使用すると、精度の検証に失敗する場合があります。必要に応じて、列の精度を最大値の6に設定してください。
JSON型
JSONデータ型は、データベース内でJSON(JavaScript Object Notation)データを格納および処理するための特殊なデータ型です。JSON値は、オブジェクト(JSONオブジェクト)、配列、文字列、数値、ブール値(false/true)、または null で構成されている必要があります。ここで、false、true、null は小文字のみを許可します。
ユーザーはテーブルにJSON列を作成し、OBKV-Table Javaクライアントインターフェースを使用してJSONデータの読み書きを行うことができます。クライアントから書き込む際には、JSONデータを特定のJava型に変換して渡す必要があります。現在サポートされているJava型は以下のとおりです:
- String
- byte[]
ユーザーは各テーブルに複数のJSON型列を作成できますが、以下の点に注意してください:
- JSON型の列は
PRIMARY KEY、FOREIGN KEY、UNIQUE KEYとしては使用できませんが、NOT NULLまたはCHECK制約を追加できます。 - JSON型の列にはデフォルト値を含めることはできません。
- JSON型の列はパーティションキーとしては使用できません。
- JSONデータの長さは
LONGTEXTの長さを超えてはなりません。各JSONオブジェクトまたは配列の最大深さはデフォルトで100ですが、パラメータ json_document_max_depth で設定できます。 - クライアントからJSONデータを書き込むと、内部のキーが並べ替えられる可能性があります。例えば、
{"b": 1, "a": 2}を書き込んだ場合、読み取ったデータは{"a":2, "b":1}になる可能性があります。"a" と "b" の順序が入れ替わっていますが、それでも同じJSONオブジェクトです。
OBKV-TableでJSON型を使用する際の制限事項は以下のとおりです:
- JSONデータの格納と取得のみをサポートしており、JSON関連の関数(例:
JSON_EXTRACTなど)はサポートしていません。 - クライアントは
putインターフェースを使用してJSONデータを書き込むことはできません。insertOrUpdateインターフェースを使用した書き込みを推奨します。 - その他の非サポートJava型(例:Integer、Booleanなど)を使用してJSON列に書き込もうとすると、
OB_KV_COLUMN_TYPE_NOT_MATCHエラーが発生します。
JSON列を作成する例:
CREATE TABLE t1_json(
k BIGINT,
v JSON,
PRIMARY KEY(k))
kv_attributes = '{"Table": {}}'
PARTITION BY KEY(k) PARTITIONS 97;
クライアントからJSONデータを書き込む例:
Row rowKey = row(colVal("k", 1));
String jsonText = "{ \"greeting\" : \"Hello!\", \"farewell\" : \"bye-bye!\", \
\"json_text\" : \"test!\" }";
client.insertOrUpdate("test")
.setRowKey(rowKey)
.addMutateColVal(colVal("v", jsonText)).execute();
クライアントからJSONデータを読み取る例:
Map<String, Object> res = client.get(tableName)
.setRowKey(row(colVal("k", 1)))
.select("k", "v")
.execute();
System.out.println(res.get("v"));
Java型とOBKV-Table型のマッピング
Javaデータ型とOBKV-Tableデータ型の対応関係は以下のとおりです:
Java型 |
OBKV-Table型 |
|---|---|
| Boolean | TinyInt |
| Byte | Varbinary |
| Short | SmallInt |
| Integer | Int |
| Long | BigInt |
| String | Varchar |
| Byte[] | Varchar |
| Double | Double |
| Float | Float |
| Timestamp | Timestamp |
| java.sql.Date | DateTime |
| Date | DateTime |
| String (JSON形式) | JSON |
注意
- JavaでString / Byte[]型を使用する場合、テーブル内のVarchar列のデータ長制限を超えてはなりません。
- Javaの時刻型(Timestamp、java.sql.Date、Date)は、テーブル内のTimeStamp列またはDateTime列の精度制限を超えてはなりません。TimeStamp列またはDateTime列のデフォルト精度は0です。