## 10.4. Value Storage

 Values to be inserted into a table are converted to the destination column's data type according to the following steps.

**Value Storage Type Conversion**

1. Check for an exact match with the target.

2. Otherwise, try to convert the expression to the target type. This is possible
   if an *assignment cast* between the two types is registered in the`pg_cast` catalog (see [CREATE CAST](sql-createcast.html)).
   Alternatively, if the expression is an unknown-type literal, the contents of
   the literal string will be fed to the input conversion routine for the target
   type.

3. Check to see if there is a sizing cast for the target type. A sizing
   cast is a cast from that type to itself. If one is found in the`pg_cast` catalog, apply it to the expression before storing
   into the destination column. The implementation function for such a cast
   always takes an extra parameter of type `integer`, which receives
   the destination column's `atttypmod` value (typically its
   declared length, although the interpretation of `atttypmod`varies for different data types), and it may take a third `boolean`parameter that says whether the cast is explicit or implicit. The cast
   function
   is responsible for applying any length-dependent semantics such as size
   checking or truncation.

**Example 10.9. `character` Storage Type Conversion**

For a target column declared as `character(20)` the following
statement shows that the stored value is sized correctly:

```
CREATE TABLE vv (v character(20));
INSERT INTO vv SELECT 'abc' || 'def';
SELECT v, octet_length(v) FROM vv;

          v           | octet_length
