10.4. Хранилище значений#
10.4. Хранилище значений #
Все значения, которые будут вставлены в таблицу, преобразуются в тип данных столбца назначения в соответствии со следующими шагами.
Тип хранения значения преобразования
Проверьте точное совпадение с целью.
В противном случае попробуйте преобразовать выражение в целевой тип. Это возможно, если между двумя типами зарегистрировано приведение типов assignment cast в каталоге
pg_cast
(см. CREATE CAST). В качестве альтернативы, если выражение является литералом неизвестного типа, содержимое строки литерала будет передано в процедуру преобразования ввода для целевого типа.Проверьте, есть ли приведение размера для целевого типа. Приведение размера - это приведение из этого типа к самому себе. Если оно найдено в каталоге
pg_cast
, примените его к выражению перед сохранением в столбец назначения. Функция реализации для такого приведения всегда принимает дополнительный параметр типаinteger
, который получает значениеatttypmod
столбца назначения (обычно его объявленную длину, хотя интерпретацияatttypmod
может варьироваться для разных типов данных), и она может принимать третий параметр типаboolean
, который указывает, является ли приведение явным или неявным. Функция приведения отвечает за применение любых зависящих от длины семантик, таких как проверка размера или усечение.
Пример 10.9. символ
Преобразование типа хранения
Для целевого столбца, объявленного как 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)
Что здесь на самом деле произошло, так это то, что два неизвестных литерала по умолчанию преобразуются в text
, что позволяет оператору ||
быть преобразованным в конкатенацию text
. Затем результат оператора text
преобразуется в bpchar
(“blank-padded char”, внутреннее имя типа данных character
) для соответствия типу целевой колонки. (Поскольку преобразование из text
в bpchar
является бинарным принудительным преобразованием, это преобразование не вставляет никакого реального вызова функции). Наконец, функция размера bpchar(bpchar, integer, boolean)
находится в системном каталоге и применяется к результату оператора и сохраненной длине колонки. Эта типо-специфичная функция выполняет необходимую проверку длины и добавление пробелов для выравнивания.