JDBC-драйвер
clickhouse-jdbc реализует стандартный интерфейс JDBC с использованием последней версии Java-клиента.
Рекомендуется напрямую использовать последнюю версию Java-клиента, если критичны производительность или прямой доступ.
Требования к среде
- OpenJDK версии >= 8
Настройка
- Maven
- Gradle (Kotlin)
- Gradle
Если вы используете драйвер JDBC в приложении, которое требует добавления JAR-файла в classpath, вам нужно загрузить JAR-файл по следующему адресу:
- Maven Central и добавьте его в classpath
- начиная с версии
0.9.4доступен артефакт https://mvnrepository.com/artifact/com.clickhouse/clickhouse-jdbc-all - используйте квалификатор
all, чтобы получить JAR‑файл, включающий всеshaded‑зависимости.
- начиная с версии
- или из официального репозитория по этой ссылке
Конфигурация
Класс драйвера: com.clickhouse.jdbc.ClickHouseDriver
com.clickhouse.jdbc.ClickHouseDriver — это класс‑фасад для новой и старой реализаций JDBC. По умолчанию используется новая реализация JDBC.
Чтобы использовать старую реализацию JDBC, установите свойство clickhouse.jdbc.v1 в значение true в параметрах подключения.
com.clickhouse.jdbc.Driver — новая реализация JDBC.
com.clickhouse.jdbc.DriverV1 — старая реализация JDBC.
Синтаксис URL: jdbc:(ch|clickhouse)[:<protocol>]://endpoint[:port][/<database>][?param1=value1¶m2=value2][#tag1,tag2,...], например:
jdbc:clickhouse:http://localhost:8123jdbc:clickhouse:https://localhost:8443?ssl=true
Обратите внимание на следующие особенности синтаксиса URL:
- в URL допускается только одна конечная точка
- протокол следует указывать, если используется не протокол по умолчанию — 'HTTP'
- порт следует указывать, если используется порт, отличный от порта по умолчанию '8123'
- драйвер не определяет протокол по номеру порта, его нужно указывать явно
- Параметр
sslне требуется, если протокол указан.
Свойства соединения
Основные параметры конфигурации определены в Java-клиенте. Их следует передавать драйверу без изменений. Драйвер имеет собственные свойства, которые не входят в конфигурацию клиента; они перечислены ниже.
Свойства драйвера:
| Свойство | Значение по умолчанию | Описание |
|---|---|---|
disable_frameworks_detection | true | Отключить определение фреймворков по заголовку User-Agent |
jdbc_ignore_unsupported_values | false | Подавляет SQLFeatureNotSupportedException в случаях, когда это не влияет на работу драйвера |
clickhouse.jdbc.v1 | false | Использовать старую реализацию JDBC вместо новой |
default_query_settings | null | Позволяет передавать настройки запроса по умолчанию при выполнении запросов |
jdbc_resultset_auto_close | true | Автоматически закрывает ResultSet при закрытии Statement |
beta.row_binary_for_simple_insert | false | Использовать реализацию PreparedStatement, основанную на записи в формате RowBinary. Работает только для запросов INSERT INTO ... VALUES. |
jdbc_resultset_auto_close | true | Автоматически закрывает ResultSet при закрытии объекта Statement |
jdbc_use_max_result_rows | false | Включает использование серверного свойства max_result_rows для ограничения количества строк, возвращаемых запросом. При включении переопределяет режим переполнения, установленный пользователем. Подробности см. в JavaDoc. |
jdbc_sql_parser | JAVACC | Настраивает, какой SQL‑парсер использовать. Доступные варианты: ANTLR4, ANTLR4_PARAMS_PARSER, JAVACC. |
Все настройки сервера должны иметь префикс clickhouse_setting_ (как и в конфигурации клиента).
Пример конфигурации:
что будет эквивалентно следующему JDBC URL:
Примечание: URL-кодирование JDBC URL или свойств не требуется — они будут закодированы автоматически.
Поддерживаемые типы данных
Драйвер JDBC поддерживает те же форматы данных, что и базовый Java-клиент.
Сопоставление типов JDBC
Следующее сопоставление применяется к:
ResultSet#getObject(columnIndex)— метод вернёт объект соответствующего Java‑класса. (Int8->java.lang.Byte,Int16->java.lang.Shortи т. д.)ResultSetMetaData#getColumnType(columnIndex)— этот метод вернёт соответствующий тип JDBC. (Int8->java.lang.Byte,Int16->java.lang.Shortи т. д.)
Существует несколько способов изменить сопоставление:
- Метод
ResultSet#getObject(columnIndex, class)пытается преобразовать значение к типуclass. Для таких преобразований существуют некоторые ограничения. Подробности см. в соответствующих разделах.
Числовые типы
| Тип в ClickHouse | Тип JDBC | Класс Java |
|---|---|---|
| Int8 | TINYINT | java.lang.Byte |
| Int16 | SMALLINT | java.lang.Short |
| Int32 | INTEGER | java.lang.Integer |
| Int64 | BIGINT | java.lang.Long |
| Int128 | OTHER | java.math.BigInteger |
| Int256 | OTHER | java.math.BigInteger |
| UInt8 | OTHER | java.lang.Short |
| UInt16 | OTHER | java.lang.Integer |
| UInt32 | OTHER | java.lang.Long |
| UInt64 | OTHER | java.math.BigInteger |
| UInt128 | OTHER | java.math.BigInteger |
| UInt256 | OTHER | java.math.BigInteger |
| Float32 | REAL | java.lang.Float |
| Float64 | DOUBLE | java.lang.Double |
| Decimal32 | DECIMAL | java.math.BigDecimal |
| Decimal64 | DECIMAL | java.math.BigDecimal |
| Decimal128 | DECIMAL | java.math.BigDecimal |
| Decimal256 | DECIMAL | java.math.BigDecimal |
| Bool | BOOLEAN | java.lang.Boolean |
- Числовые типы взаимно преобразуемы. Поэтому значение
Int8можно получить в видеFloat64и наоборот:rs.getObject(1, Float64.class)вернёт значение типаFloat64из столбцаInt8.rs.getLong(1)вернёт значение типаLongиз столбцаInt8.rs.getByte(1)может вернуть значение типаByteиз столбцаInt16, если оно укладывается в диапазон типаByte.
- Преобразование из более широкого типа в более узкий не рекомендуется из‑за риска повреждения данных.
- Тип
Boolтакже ведёт себя как числовой тип. - Все числовые типы можно читать как
java.lang.String.
Строковые типы
| Тип в ClickHouse | Тип в JDBC | Класс в Java |
|---|---|---|
| String | VARCHAR | java.lang.String |
| FixedString | VARCHAR | java.lang.String |
Stringможно читать только какjava.lang.Stringилиbyte[].FixedStringсчитывается как есть и дополняется нулевыми байтами до длины столбца. (Например,FixedString(10)для'John'будет прочитан как'John\0\0\0\0\0\0\0\0\0'.)
Типы перечислений (Enum)
| Тип ClickHouse | Тип JDBC | Класс Java |
|---|---|---|
| Enum8 | OTHER | java.lang.String |
| Enum16 | OTHER | java.lang.String |
Enum8иEnum16по умолчанию сопоставляются сjava.lang.String.- Значения Enum можно читать как числовые, используя специализированный числовой геттер или метод
getObject(columnIndex, Integer.class). Enum16внутренне сопоставляется с типом short, аEnum8— с типом byte. Не следует читать значенияEnum16как byte из‑за риска повреждения данных.- Значения Enum в
PreparedStatementможно задавать как строковые или числовые.
Типы даты и времени
| Тип ClickHouse | Тип JDBC | Класс Java |
|---|---|---|
| Date | DATE | java.sql.Date |
| Date32 | DATE | java.sql.Date |
| DateTime | TIMESTAMP | java.sql.Timestamp |
| DateTime64 | TIMESTAMP | java.sql.Timestamp |
| Time | TIME | java.sql.Time |
| Time64 | TIME | java.sql.Time |
- Типы Date / Time сопоставляются с типами
java.sqlдля лучшей совместимости с JDBC. Однако можно получить объектыjava.time.LocalDate,java.time.LocalDateTime,java.time.LocalTime, используяResultSet#getObject(columnIndex, Class<T>)и передав соответствующий класс в качестве второго аргумента.rs.getObject(1, java.time.LocalDate.class)вернёт значениеjava.time.LocalDateиз столбцаDate.rs.getObject(1, java.time.LocalDateTime.class)вернёт значениеjava.time.LocalDateTimeиз столбцаDateTime.rs.getObject(1, java.time.LocalTime.class)вернёт значениеjava.time.LocalTimeиз столбцаTime.
Date,Date32,Time,Time64не зависят от часового пояса сервера.DateTime,DateTime64зависят от часового пояса сервера или сеанса.DateTimeиDateTime64можно получить в видеZonedDateTime, используяgetObject(colIndex, ZonedDateTime.class).
Вложенные типы
| Тип ClickHouse | Тип JDBC | Класс Java |
|---|---|---|
| Array | ARRAY | java.sql.Array |
| Tuple | OTHER | com.clickhouse.data.Tuple |
| Map | JAVA_OBJECT | java.util.Map |
| Nested | ARRAY | java.sql.Array |
Arrayпо умолчанию сопоставляется сjava.sql.Arrayдля совместимости с JDBC. Это также позволяет получить больше информации о возвращаемом значении массива, что полезно для вывода типов.Arrayреализует методgetResultSet(), возвращающийjava.sql.ResultSetс тем же содержимым, что и исходный массив.- Типы коллекций не следует читать как
java.lang.String, поскольку это некорректный способ представления данных (например, строковые значения в массиве не заключаются в кавычки). Mapсопоставляется типуJAVA_OBJECT, так как значение можно получить только через методgetObject(columnIndex, Class<T>).Mapне являетсяjava.sql.Struct, поскольку у него нет именованных столбцов.
Tupleсопоставляется сObject[], поскольку он может содержать элементы разных типов, а использованиеListздесь некорректно.Tupleможно прочитать какArrayс помощью методаgetObject(columnIndex, Array.class). В этом случаеArray#baseTypeNameвернёт определение столбца типаTuple.
Запись массивов
Используйте java.sql.Connection#createArrayOf для создания объекта java.sql.Array. Этот объект предназначен для унификации работы с массивами в различных базах данных.
Соединение необходимо для передачи конфигурации в фабричный метод Array.
Метод принимает два аргумента:
typeName— название типа элементов массива. Например,Array(Int32)->"Int32".elements— сами элементы массива. Например,[[1, 2, 3], [4, 5, 6]]->new Integer[][] {{1, 2, 3}, {4, 5, 6}}.
Кортеж можно представить как Object[] или как java.sql.Struct (см. ниже, как записывать кортежи).
Пример
Чтение массивов
Используйте ResultSet#getArray(columnIndex) для чтения объекта Array. Этот объект можно использовать для доступа к массиву произвольной вложенности.
Метод Array#getResultSet() можно использовать для чтения элементов массива в более унифицированном виде — как java.sql.ResultSet. Это полезно,
когда точный тип элементов массива заранее неизвестен.
Пример
Запись кортежей
Кортежи сопоставляются с объектом com.clickhouse.data.Tuple и должны записываться как этот объект с помощью метода setObject(columnIndex, tuple).
Для лучшей переносимости можно использовать объект java.sql.Struct для записи кортежей.
Пример
Чтение кортежей
Метод getObject(columnIndex) вернёт Object[]. Кортежи можно читать как java.sql.Array с помощью метода getObject(columnIndex, Array.class).
Пример
Запись в Map
Map можно записать только как объект java.collections.Map, поскольку этот тип требует пар ключ-значение (java.sql.Struct не поддерживает пары ключ-значение).
Пример
Чтение типов Map
Map можно получить как объект java.util.Map, используя метод getObject(columnIndex, Map.class).
Пример
Запись в Nested
Используйте java.sql.Connection#createStruct для создания экземпляра java.sql.Struct. Этот объект предназначен для унифицированной обработки вложенных структур в разных базах данных.
Объект Connection необходим для передачи конфигурации фабричному методу Struct.
Метод принимает два аргумента:
typeName— имя типа для вложенных элементов. Например,Nested(Tuple(Int32, String))->"Nested(Tuple(Int32, String))".elements— это собственно вложенные элементы. Например,[1, 'test']->new Object[] {1, 'test'}.
Пример
Чтение вложенных типов
Используйте ResultSet#getStruct(columnIndex, StructDescriptor) для чтения объекта Nested. Этот объект можно использовать для доступа к вложенным элементам любой глубины.
Метод Struct#getResultSet() можно использовать для чтения вложенных элементов в более унифицированном виде, как java.sql.ResultSet. Это полезно,
когда точный тип вложенных элементов неизвестен.
Пример
Геотипы
| Тип ClickHouse | Тип JDBC | Класс Java |
|---|---|---|
| Point | OTHER | double[] |
| Ring | OTHER | double[][] |
| Polygon | OTHER | double[][][] |
| MultiPolygon | OTHER | double[][][][] |
Типы Nullable и LowCardinality
NullableиLowCardinality— это специальные типы-обёртки для других типов.Nullableвлияет на то, какResultSetMetaDataвозвращает имена типов
Специальные типы
| Тип в ClickHouse | Тип JDBC | Класс Java |
|---|---|---|
| UUID | OTHER | java.util.UUID |
| IPv4 | OTHER | java.net.Inet4Address |
| IPv6 | OTHER | java.net.Inet6Address |
| JSON | OTHER | java.lang.String |
| AggregateFunction | OTHER | (двоичное представление) |
| SimpleAggregateFunction | (тип-обёртка) | (класс-обёртка) |
UUIDне относится к стандартным типам JDBC. Однако он входит в состав JDK. По умолчанию методgetObject()возвращает объектjava.util.UUID.UUIDможно считывать и записывать в видеStringс помощью методаgetObject(columnIndex, String.class).IPv4иIPv6не являются стандартными типами JDBC. Однако они входят в JDK. По умолчанию методgetObject()возвращает объекты типовjava.net.Inet4Addressиjava.net.Inet6Address.IPv4иIPv6можно читать и записывать как значения типаStringс помощью методаgetObject(columnIndex, String.class).
Обработка дат, времени и часовых поясов
java.sql.Date, java.sql.Time и java.sql.Timestamp могут усложнять вычисление часовых поясов — хотя они, разумеется, поддерживаются,
имеет смысл рассмотреть использование пакета java.time. ZonedDateTime и
OffsetDateTime хорошо подходят на замену типам java.sql.Timestamp, java.sql.Date и java.sql.Time.
Date хранится без часового пояса, тогда как DateTime хранится с часовым поясом. Это может привести к неожиданным результатам, если обращаться неосторожно.
Создание соединения
Предоставление учётных данных и настроек
Простое выражение
Вставка данных
HikariCP
Дополнительная информация
Дополнительную информацию см. в нашем репозитории GitHub и документации Java-клиента.
Устранение неполадок
Логирование
Драйвер использует slf4j для ведения журнала и будет использовать первую доступную реализацию в classpath.
Устранение таймаута JDBC при больших вставках данных
При выполнении больших вставок в ClickHouse с длительным временем выполнения могут возникать ошибки тайм-аута JDBC, такие как:
Эти ошибки могут нарушить процесс вставки данных и повлиять на стабильность системы. Чтобы устранить эту проблему, возможно, потребуется настроить несколько параметров таймаута в операционной системе клиента.
Mac OS
В macOS можно настроить следующие параметры для решения проблемы:
net.inet.tcp.keepidle: 60000net.inet.tcp.keepintvl: 45000net.inet.tcp.keepinit: 45000net.inet.tcp.keepcnt: 8net.inet.tcp.always_keepalive: 1
Linux
В Linux одних только эквивалентных настроек может быть недостаточно для устранения проблемы. Из‑за особенностей того, как Linux обрабатывает параметры keep-alive для сокетов, требуются дополнительные действия. Выполните следующие шаги:
- Настройте следующие параметры ядра Linux в
/etc/sysctl.confили соответствующем конфигурационном файле:
net.inet.tcp.keepidle: 60000net.inet.tcp.keepintvl: 45000net.inet.tcp.keepinit: 45000net.inet.tcp.keepcnt: 8net.inet.tcp.always_keepalive: 1net.ipv4.tcp_keepalive_intvl: 75net.ipv4.tcp_keepalive_probes: 9net.ipv4.tcp_keepalive_time: 60 (можно рассмотреть снижение этого значения по сравнению со значением по умолчанию — 300 секунд)
- После изменения параметров ядра примените их, выполнив следующую команду:
После настройки этих параметров необходимо убедиться, что ваш клиент включает опцию Keep Alive для сокета:
Руководство по миграции
Основные изменения
| Возможность | V1 (устаревшая) | V2 (новая) |
|---|---|---|
| Поддержка транзакций | Частично поддерживается | Не поддерживается |
| Переименование столбцов в результирующем наборе | Частично поддерживается | Не поддерживается |
| SQL с несколькими операторами | Не поддерживается | Недоступно |
| Именованные параметры запроса | Поддерживается | Не поддерживается (отсутствует в спецификации JDBC) |
Потоковая передача данных с использованием PreparedStatement | Поддерживается | Не поддерживается |
- JDBC V2 реализован как более лёгкий, поэтому некоторые возможности были удалены.
- Потоковая передача данных не поддерживается в JDBC V2, так как она не предусмотрена спецификацией JDBC и платформой Java.
- JDBC V2 требует явной конфигурации. Не задаёт параметров отказоустойчивости по умолчанию.
- Протокол в URL должен быть указан явно. Протокол не определяется неявно по номеру порта.
Изменения конфигурации
Доступны только два перечисления:
com.clickhouse.jdbc.DriverProperties— собственные параметры конфигурации драйвера.com.clickhouse.client.api.ClientConfigProperties— свойства конфигурации клиента. Изменения конфигурации клиента описаны в документации по Java‑клиенту.
Свойства подключения разбираются следующим образом:
- Сначала свойства берутся из URL. Они переопределяют все остальные свойства.
- Свойства драйвера не передаются клиенту.
- Конечные точки (host, port, protocol) определяются из URL.
Example:
Изменения типов данных
Числовые типы
| Тип ClickHouse | Совместим с V1 | Тип JDBC (V2) | Класс Java (V2) | Тип JDBC (V1) | Класс Java (V1) |
|---|---|---|---|---|---|
| Int8 | ✅ | TINYINT | java.lang.Byte | TINYINT | java.lang.Byte |
| Int16 | ✅ | SMALLINT | java.lang.Short | SMALLINT | java.lang.Short |
| Int32 | ✅ | INTEGER | java.lang.Integer | INTEGER | java.lang.Integer |
| Int64 | ✅ | BIGINT | java.lang.Long | BIGINT | java.lang.Long |
| Int128 | ✅ | OTHER | java.math.BigInteger | OTHER | java.math.BigInteger |
| Int256 | ✅ | OTHER | java.math.BigInteger | OTHER | java.math.BigInteger |
| UInt8 | ❌ | OTHER | java.lang.Short | OTHER | com.clickhouse.data.value.UnsignedByte |
| UInt16 | ❌ | OTHER | java.lang.Integer | OTHER | com.clickhouse.data.value.UnsignedShort |
| UInt32 | ❌ | OTHER | java.lang.Long | OTHER | com.clickhouse.data.value.UnsignedInteger |
| UInt64 | ❌ | OTHER | java.math.BigInteger | OTHER | com.clickhouse.data.value.UnsignedLong |
| UInt128 | ✅ | OTHER | java.math.BigInteger | OTHER | java.math.BigInteger |
| UInt256 | ✅ | OTHER | java.math.BigInteger | OTHER | java.math.BigInteger |
| Float32 | ✅ | REAL | java.lang.Float | REAL | java.lang.Float |
| Float64 | ✅ | DOUBLE | java.lang.Double | DOUBLE | java.lang.Double |
| Decimal32 | ✅ | DECIMAL | java.math.BigDecimal | DECIMAL | java.math.BigDecimal |
| Decimal64 | ✅ | DECIMAL | java.math.BigDecimal | DECIMAL | java.math.BigDecimal |
| Decimal128 | ✅ | DECIMAL | java.math.BigDecimal | DECIMAL | java.math.BigDecimal |
| Decimal256 | ✅ | DECIMAL | java.math.BigDecimal | DECIMAL | java.math.BigDecimal |
| Bool | ✅ | BOOLEAN | java.lang.Boolean | BOOLEAN | java.lang.Boolean |
- Наибольшее отличие состоит в том, что беззнаковые типы сопоставляются с типами Java, что повышает переносимость.
Строковые типы
| Тип ClickHouse | Совместимость с V1 | Тип JDBC (V2) | Класс Java (V2) | Тип JDBC (V1) | Класс Java (V1) |
|---|---|---|---|---|---|
| String | ✅ | VARCHAR | java.lang.String | VARCHAR | java.lang.String |
| FixedString | ✅ | VARCHAR | java.lang.String | VARCHAR | java.lang.String |
FixedStringчитается «как есть» в обеих версиях. Например,FixedString(10)для'John'будет прочитан как'John\0\0\0\0\0\0\0\0\0'.- Когда используется
PreparedStatement#setBytes, значение будет преобразовано вunhex('<hex_string>'), а затем считано какString. - Строки хранятся в кодировке UTF-8.
Типы даты и времени
| Тип в ClickHouse | Совместим с V1 | Тип JDBC (V2) | Класс Java (V2) | Тип JDBC (V1) | Класс Java (V1) |
|---|---|---|---|---|---|
| Date | ❌ | DATE | java.sql.Date | DATE | java.time.LocalDate |
| Date32 | ❌ | DATE | java.sql.Date | DATE | java.time.LocalDate |
| DateTime | ❌ | TIMESTAMP | java.sql.Timestamp | TIMESTAMP | java.time.OffsetDateTime |
| DateTime64 | ❌ | TIMESTAMP | java.sql.Timestamp | TIMESTAMP | java.time.OffsetDateTime |
| Time | ✅ | TIME | java.sql.Time | новый тип / не поддерживается | новый тип / не поддерживается |
| Time64 | ✅ | TIME | java.sql.Time | новый тип/не поддерживается | новый тип/не поддерживается |
TimeиTime64поддерживаются в V2 только как новые типы данных.DateTimeиDateTime64сопоставляются сjava.sql.Timestampдля обеспечения лучшей совместимости с JDBC.
Типы Enum
| Тип ClickHouse | Совместим с V1 | JDBC Type (V2) | Java Class (V2) | JDBC Type (V1) | Java Class (V1) |
|---|---|---|---|---|---|
| Enum | ✅ | VARCHAR | java.lang.String | OTHER | java.lang.String |
| Enum8 | ✅ | VARCHAR | java.lang.String | OTHER | java.lang.String |
| Enum16 | ✅ | VARCHAR | java.lang.String | OTHER | java.lang.String |
Вложенные типы
| Тип ClickHouse | Совместимость с V1 | Тип JDBC (V2) | Класс Java (V2) | Тип JDBC (V1) | Класс Java (V1) |
|---|---|---|---|---|---|
| Array | ❌ | ARRAY | java.sql.Array | ARRAY | Object[] или массив примитивных типов |
| Tuple | ❌ | OTHER | Object[] | STRUCT | java.sql.Struct |
| Map | ❌ | JAVA_OBJECT | java.util.Map | STRUCT | java.util.Map |
| Nested | ❌ | ARRAY | java.sql.Array | STRUCT | java.sql.Struct |
- В V2
Arrayпо умолчанию сопоставляется сjava.sql.Arrayдля совместимости с JDBC. Это также делается, чтобы предоставить более подробную информацию о возвращаемом значении массива, что полезно для вывода типов. - В V2
Arrayреализует методgetResultSet(), который возвращает объектjava.sql.ResultSetс тем же содержимым, что и исходный массив. - V1 использует
STRUCTдляMap, но всегда возвращает объект типаjava.util.Map. V2 исправляет это за счёт сопоставленияMapсJAVA_OBJECT. - V1 использует
STRUCTдляTuple, но всегда возвращает объект типаList<Object>. V2 сопоставляетTupleсOTHERи по умолчанию возвращаетObject[]. - V2 добавляет
com.clickhouse.data.Tuple#Tupleдля записи кортежей. Это упрощает определение, является ли значение кортежем или массивом. - Методы
PreparedStatement#setBytesиResultSet#getBytesнельзя применять к типам коллекций. Они предназначены для работы с бинарными строками. - Обычно для записи и чтения значений типа
Arrayиспользуетсяjava.sql.Array. Драйвер JDBC полностью поддерживает этот механизм. - В V2 тип
Nestedсопоставляется с типомArrayи представляется в виде массива кортежей. - V2 имеет частичную поддержку
java.sql.Struct, поскольку этот тип очень похож на Array и не поддерживает пары ключ‑значение.Structможно использовать для записи значений типаTuple.
Геотипы
| Тип ClickHouse | Совместимость с V1 | Тип JDBC (V2) | Класс Java (V2) | Тип JDBC (V1) | Класс Java (V1) |
|---|---|---|---|---|---|
| Point | ✅ | OTHER | double[] | OTHER | double[] |
| Ring | ✅ | OTHER | double[][] | OTHER | double[][] |
| Polygon | ✅ | OTHER | double[][][] | OTHER | double[][][] |
| MultiPolygon | ✅ | OTHER | double[][][][] | OTHER | double[][][][] |
Типы Nullable и LowCardinality
NullableиLowCardinality— это специальные типы, которые оборачивают другие типы.- В V2 в этих типах изменений нет.
Специальные типы
| Тип ClickHouse | Совместим с V1 | Тип JDBC (V2) | Класс Java (V2) | Тип JDBC (V1) | Класс Java (V1) |
|---|---|---|---|---|---|
| JSON | ❌ | OTHER | java.lang.String | не поддерживается | не поддерживается |
| AggregateFunction | ✅ | OTHER | (двоичное представление) | OTHER | (двоичное представление) |
| SimpleAggregateFunction | ✅ | (тип-обёртка) | (класс-обёртка) | (тип-обёртка) | (класс-обёртка) |
| UUID | ✅ | OTHER | java.util.UUID | VARCHAR | java.util.UUID |
| IPv4 | ✅ | OTHER | java.net.Inet4Address | VARCHAR | java.net.Inet4Address |
| IPv6 | ✅ | OTHER | java.net.Inet6Address | VARCHAR | java.net.Inet6Address |
| Dynamic | ❌ | OTHER | java.lang.Object | не поддерживается | не поддерживается |
| Variant | ❌ | OTHER | java.lang.Object | не поддерживается | не поддерживается |
- V1 использует
VARCHARдляUUID, но при этом всегда возвращает объектjava.util.UUID. V2 исправляет это, сопоставляяUUIDсOTHERи также возвращая объектjava.util.UUID. - V1 использует
VARCHARдляIPv4иIPv6, но всегда возвращает объектыjava.net.Inet4Addressиjava.net.Inet6Address. V2 исправляет это, сопоставляяIPv4иIPv6сOTHERи тоже возвращает объектыjava.net.Inet4Addressиjava.net.Inet6Address. DynamicиVariantявляются новыми типами в V2. В V1 они не поддерживаются.- Тип
JSONпостроен на основе типаDynamic. Поэтому он поддерживается только в V2. - Значения IPv4 и IPv6 можно считывать в виде массива байт (
byte[]), используя методgetBytes(columnIndex). Однако рекомендуется использовать специализированные классы для этих типов. - V2 не поддерживает чтение IP‑адресов в виде числовых значений, поскольку преобразование лучше реализовано в классах InetAddress.
Изменения метаданных базы данных
- В V2 для обозначения баз данных используется только термин
Schema. ТерминCatalogзарезервирован для будущего использования. - V2 возвращает
falseдляDatabaseMetaData.supportsTransactions()иDatabaseMetaData.supportsSavepoints(). Это поведение будет изменено в последующих версиях.