メインコンテンツへスキップ

型変換

このクライアントは、挿入時とレスポンスのマーシャリング時の両方で、できるだけ柔軟にさまざまな変数型を受け入れられるよう設計されています。ほとんどの場合、ClickHouse のカラム型には対応する Golang の型が存在します。たとえば、UInt64 には uint64 が対応します。こうした論理的な対応関係は常にサポートされるべきです。また、変数や受信データを事前に変換できるのであれば、カラムに挿入できる型やレスポンスの受け取りに使える型として、別の変数型を利用したい場合もあるでしょう。クライアントは、ユーザーが挿入前にデータ型を厳密に合わせるための変換を行わなくて済むようにし、さらにクエリ時の柔軟なマーシャリングを実現するため、これらの変換を透過的にサポートすることを目指しています。ただし、この透過的な変換では精度の損失は許容されません。たとえば、UInt64 カラムのデータを受け取る型として uint32 を使うことはできません。一方、datetime64 フィールドには、フォーマット要件を満たしていれば string を挿入できます。 現在プリミティブ型でサポートされている型変換は、こちらにまとめられています。 この対応は現在も進行中で、挿入時 (Append/AppendRow) と読み取り時 (Scan 経由) に分けて考えることができます。特定の変換のサポートが必要な場合は、issue を作成してください。 標準の database/sql インターフェイスでは、ClickHouse API と同じ型がサポートされるはずです。いくつか例外はありますが、主に複雑な型に関するもので、以下のセクションで説明しています。ClickHouse API と同様に、このクライアントは、挿入時とレスポンスのマーシャリング時の両方で、できるだけ柔軟にさまざまな変数型を受け入れられるよう設計されています。

複合型

Date/DateTime

ClickHouse の Go クライアントは、DateDate32DateTimeDateTime64 の日付/日時型をサポートしています。日付は、2006-01-02 フォーマットの文字列、または Go ネイティブの time.Time{}sql.NullTime を使って挿入できます。DateTime でも同様にこれらの型をサポートしていますが、文字列を渡す場合は 2006-01-02 15:04:05 フォーマットを使用し、必要に応じてタイムゾーンオフセット (例: 2006-01-02 15:04:05 +08:00) を付ける必要があります。読み取り時も time.Time{}sql.NullTime の両方がサポートされており、sql.Scanner インターフェイスを実装した任意の型も利用できます。 タイムゾーン情報の扱いは、ClickHouse の型と、値を挿入する場合か読み取る場合かによって異なります。
  • DateTime/DateTime64
    • insert 時には、値は UNIX timestamp フォーマットで ClickHouse に送信されます。タイムゾーンが指定されていない場合、クライアントはクライアントのローカルタイムゾーンを使用します。time.Time{} または sql.NullTime も、それに応じて epoch に変換されます。
    • select 時には、time.Time 値を返す際、設定されていればカラムのタイムゾーンが使用されます。設定されていない場合は、server のタイムゾーンが使用されます。
  • Date/Date32
    • insert 時には、日付を unix timestamp に変換する際に、その日付のタイムゾーンが考慮されます。つまり、Date 型は ClickHouse ではロケールを持たないため、日付として保存される前にタイムゾーン分のオフセットが適用されます。文字列の値でこれが指定されていない場合は、ローカルタイムゾーンが使用されます。
    • select 時には、time.Time{} または sql.NullTime{} のインスタンスにスキャンされた日付は、タイムゾーン情報なしで返されます。

Time/Time64 型

TimeTime64 のカラム型は、日付部分を含まない時刻の値を格納します。どちらも Go の time.Duration にマッピングされます。
  • Time は時刻を秒精度で格納します。
  • Time64(precision) は (DateTime64 と同様に) 秒未満の精度をサポートし、precision は 0〜9 の範囲です。

Array

Array はスライスとして挿入する必要があります。要素の型規則は プリミティブ型 の場合と同様で、可能であれば要素は変換されます。 Scan 時には、スライスへのポインタを渡す必要があります。
完全なサンプル

Map

Map は、前述の型ルールに従ったキーと値を持つ Golang の map 型として挿入する必要があります。
完全な例
database/sql API を使用する場合、Map の値は厳密に型指定する必要があり、値の型として interface{} は使用できません。たとえば、Map(String,String) フィールドには map[string]interface{} を渡せないため、代わりに map[string]string を使用する必要があります。一方、interface{} 型の変数は常に互換性があるため、より複雑な構造にも使用できます。完全な例

タプル

タプルは、任意の数のカラムをまとめたものです。カラムには明示的に名前を付けることも、型だけを指定することもできます。例えば
これらの方法の中では、名前付きタプルのほうが柔軟です。名前なしタプルはスライスを使って挿入・読み取りする必要がありますが、名前付きタプルはMap型にも対応しています。
完全な例 注: 型付きのスライスとマップがサポートされています。ただし、named tuple 内のサブカラムはすべて同じ型である必要があります。

Nested

Nested フィールドは、名前付き タプル の Array に相当します。使い方は、ユーザーが flatten_nested を 1 に設定しているか 0 に設定しているかによって異なります。 flatten_nested を 0 に設定すると、Nested カラムは単一の タプル の Array のまま保持されます。これにより、挿入や取得に map のスライスを使用できるほか、任意のレベルでネストできます。以下の例に示すように、map のキーはカラム名と一致している必要があります。 注: map は タプル を表すため、その型は map[string]interface{} である必要があります。現在、値は厳密には型付けされていません。
完全な例 - flatten_tested=0 flatten_nested にデフォルト値の 1 を使用すると、ネストされたカラムはそれぞれ別個の Array にフラット化されます。そのため、挿入と取得にはネストしたスライスを使用する必要があります。任意の深さのネストでも動作する可能性はありますが、これは公式にはサポートされていません。
完全な例 - flatten_nested=1 注: Nested カラムは同じ次元である必要があります。たとえば、上記の例では、Col_2_2Col_2_1 は同じ数の要素を持つ必要があります。 インターフェイスがよりシンプルで、ネストも公式にサポートされているため、flatten_nested=0 を推奨します。

Geo 型

クライアントは、Point、Ring、LineString、Polygon、MultiPolygon、MultiLineString の各 Geo 型をサポートしています。これらの型は、Go では github.com/paulmach/orb パッケージで表現されます。
完全なサンプル

UUID

UUID 型は github.com/google/uuid パッケージでサポートされています。UUID は文字列として送信およびマーシャリングできるほか、sql.Scanner または Stringify を実装した任意の型として扱うこともできます。
完全な例

Decimal

Go には組み込みの Decimal 型がないため、元のクエリを変更せずに Decimal 型をネイティブに扱うには、サードパーティ製パッケージ github.com/shopspring/decimal の使用を推奨します。
サードパーティの依存関係を避けるために、代わりに Float を使いたくなるかもしれません。ただし、正確な値が必要な場合、ClickHouse の Float 型は推奨されません ので注意してください。それでもクライアント側で Go の組み込み Float 型を使う場合は、ClickHouse のクエリ内で toFloat64() 関数 または そのバリアント を使用して、Decimal を明示的に Float に変換する必要があります。この変換によって精度が失われる可能性がある点に注意してください。
完全な例

Nullable

Go の値 Nil は、ClickHouse の NULL を表します。これは、フィールドが Nullable として宣言されている場合に使用できます。insert 時には、通常のカラムと Nullable カラムの両方に Nil を渡せます。前者では、その型のデフォルト値が保存されます。たとえば、string であれば空文字列です。Nullable 版では、ClickHouse に NULL 値 が格納されます。 scan 時には、Nullable フィールドの nil 値を表現するために、ユーザーは nil を扱える型へのポインタ (たとえば *string) を渡す必要があります。以下の例では、Nullable(String) である col1 は、そのため **string を受け取ります。これにより nil を表現できます。
完全な例 このクライアントは、sql.NullInt64 などの sql.Null* 型にも対応しています。これらは対応する ClickHouse の型と互換性があります。

Big Ints

64ビットを超える数値型は、Go標準の big パッケージで表現されます。
完全なサンプル

BFloat16

BFloat16 は、機械学習のワークロードで使用される 16 ビットの brain float 型です。Go では、BFloat16 の値は float32 として挿入および読み取りが行われます。Nullable バリアントでは sql.NullFloat64 を使用します。
完全な例

QBit

QBit は、ベクトル埋め込みをビットスライス形式で格納するための実験的なカラム型で、ベクトル類似度検索向けに最適化されています。使用するには、allow_experimental_qbit_type 設定を有効にする必要があります。 Go では、QBit(Float32, N) カラムは []float32 として挿入およびスキャンされます。N はベクトルの次元です。
完全なサンプル
最終更新日 2026年7月3日