Документация по PostgreSQL 9.4.1 | |||
---|---|---|---|
Пред. | Уровень выше | Глава 10. Преобразование типов | След. |
10.4. Хранимое значение
Значения, вставляемые в таблицу, преобразуется в тип данных целевой колонки по следующему алгоритму.
Преобразование по типу хранения
Проверить точное совпадение с целевым типом.
Если типы не совпадают, попытаться привести тип к целевому. Это возможно, если зарегистрировано преобразование между двумя типами. Если результат выражения — строка неизвестного типа, содержимое этой строки будет подано на вход процедуре ввода целевого типа.
Проверить, не требуется ли приведение размера для целевого типа. Приведение размера — это преобразование типа к такому же. Если это приведение описано в каталоге pg_cast, применить к его к результату выражения, прежде чем сохранить в целевой колонке. Функция, реализующая такое приведение, всегда принимает дополнительный параметр типа integer, в котором передаётся значение atttypmod для целевой колонки (обычно это её объявленный размер, хотя интерпретироваться значение atttypmod для разных типов данных может по-разному), и третий параметр типа boolean, передающий признак явное/неявное преобразование. Функция приведения отвечает за все операции с длиной, включая её проверку и усечение данных.
Пример 10-8. Преобразование для типа хранения 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)
Суть происходящего здесь в том, что две константы неизвестного типа по умолчанию воспринимаются как значения text, что позволяет применить к ним оператор || как оператор конкатенации значений text. Затем результат оператора, имеющий тип text, приводится к типу bpchar ("blank-padded char" (символы, дополненные пробелами), внутреннее имя типа character) в соответствии с типом целевой колонки. (Так как типы text и bpchar двоично-совместимы, при этом преобразовании реальный вызов функции не добавляется.) Наконец, в системном каталоге находится функция изменения размера bpchar(bpchar, integer, boolean) и применяется для результата оператора и длины колонки. Эта связанная с типом функция проверяет длину данных и добавляет недостающие пробелы.
Пред. | Начало | След. |
Функции | Уровень выше | UNION, CASE и связанные конструкции |