Значения, вставляемые в таблицу, преобразуются в тип данных целевого столбца в соответствии со следующими шагами.
Преобразование типов при хранении значений
Проверьте наличие точного соответствия целевому типу данных.
В противном случае попытайтесь преобразовать выражение в целевой тип данных. Это возможно, если приведение для присваивания между этими двумя типами данных зарегистрировано в
pg_cast системном каталоге (см. CREATE CAST). Кроме того, если выражение является литералом неизвестного типа, содержимое строки литерала будет передано в процедуру преобразования ввода для целевого типа данных.
Проверьте, существует ли корректирующее приведение типов (sizing cast) для целевого типа данных. Корректирующее
приведение — это приведение типа данных к самому себе. Если таковое обнаружено в
pg_cast системном каталоге, примените его к выражению перед сохранением значения в целевой столбец. Функция реализации для такого приведения типов
всегда принимает дополнительный параметр типа integer, который получает
значение atttypmod целевого столбца (обычно это его объявленная длина, хотя интерпретация atttypmod
различается для разных типов данных); также она может принимать третий boolean
параметр, определяющий, является ли приведение явным или неявным. Функция приведения типов отвечает за применение любой зависимой от длины семантики, такой как проверка размера или усечение.
Пример 2.7.9. character Преобразование типов данных при хранении
Для целевого столбца, объявленного как character(20) следующий оператор показывает, что сохраняемое значение имеет правильный размер:
CREATE TABLE vv (v character(20));
INSERT INTO vv SELECT 'abc' || 'def';
SELECT v, octet_length(v) FROM vv;
v | функция octet_length
----------------------+--------------
abcdef | 20
(1 row)
В действительности здесь произошло то, что два литерала с неопределенным типом (unknown) были приведены к типу данных text по умолчанию, что позволило || разрешить оператор
как text операцию конкатенации. Затем text
результат оператора преобразуется в тип данных bpchar («blank-padded
char», внутреннее имя типа данных character тип данных), чтобы он соответствовал типу целевого столбца. (Поскольку преобразование из text в
bpchar является бинарно совместимым (binary-coercible), это преобразование не
добавляет реального вызова функции). Наконец, функция изменения размера
bpchar(bpchar, integer, boolean) находится в системном каталоге
и применяется к результату оператора и сохраненной длине столбца. Эта специфичная для типа функция выполняет требуемую проверку длины и добавление пробелов для дополнения.