Как в PostgreSQL осуществляется конвертация типов данных?
Что проверяют
Знаете ли вы, как PostgreSQL выбирает приведение типов и чем он строже других баз. У Java-разработчика это всплывает на стыке с JDBC и Hibernate, поэтому следом часто спрашивают про ошибку column is of type uuid but expression is of type character varying.
Как отвечать
- явное приведение: стандартный
CAST(x AS integer)или постгресовыйx::integer, для литералов ещёDATE '2026-09-10'. Разбор строк по формату даютto_date,to_timestamp,to_number, выводto_char; - неявное: каждое приведение описано в каталоге
pg_castс контекстом. Implicit применяется в выражениях само, assignment только при записи в колонку (numericвintegerприINSERTпройдёт, с округлением), explicit только по явномуCAST; - строковые литералы: у
'42'сначала типunknown, он получает тип из контекста, поэтомуWHERE id = '42'для числовой колонки работает. Аtext_col = 42падает сoperator does not exist: неявных приведений к тексту почти нет; - ошибки ввода:
'abc'::integerбросает ошибку, и транзакция переходит в состояние сбоя. С PostgreSQL 16 значение можно проверить заранее черезpg_input_is_valid('abc', 'integer').
Сторона Java. Драйвер pgjdbc отправляет параметры с типом, и setString для колонки uuid или jsonb даёт ошибку выше. Решения: передавать UUID через setObject, для JSON в Hibernate 6 ставить @JdbcTypeCode(SqlTypes.JSON), либо включить параметр драйвера stringtype=unspecified, тогда строки уходят как unknown и тип выводит сервер. Для времени: timestamptz соответствует OffsetDateTime или Instant, timestamp соответствует LocalDateTime.
Где спотыкаются
Приводят колонку, а не параметр: WHERE id::text = ?. Обычный индекс по id перестаёт использоваться, нужен индекс по выражению или правильный тип параметра.
Ждут поведения MySQL, где '5abc' в числовом контексте тихо становится 5. PostgreSQL в таких случаях падает, и это защищает данные.
Забывают, что приведение между timestamp и timestamptz зависит от параметра сессии TimeZone. На сервере с другим поясом те же данные дадут сдвиг на несколько часов.