---
title: Postgres Character data types
subtitle: Work with text data in Postgres
enableTableOfContents: true
updatedOn: '2024-06-14T07:55:54.365Z'
---
In Postgres, character data types are used to store strings. There are three primary character types: `CHAR(n)`, `VARCHAR(n)`, and `TEXT`. `CHAR(n)` and `VARCHAR(n)` types are suitable for strings with known or limited length; for example, usernames and email addresses. Whereas `TEXT` is ideal for storing large variable-length strings, such as blog posts or product descriptions.
## Storage and syntax
- `VARCHAR(n)` allows storing any string up to `n` characters.
- `CHAR(n)` stores strings in a fixed length. If a string is shorter than `n`, it is padded with spaces.
- `TEXT` has no length limit, making it ideal for large texts.
Storing strings requires one or a few bytes of overhead over the actual string length. `CHAR` and `VARCHAR` columns need an extra check at input time to ensure the string length is within the specified limit. Most Postgres string functions take and return `TEXT` values.
String values are represented as literals in single quotes. For example, `'hello'` is a string literal.
## Example usage
Consider a database tracking data for a library. We have books with titles and optional descriptions. Titles are usually of a similar length, so they can be modeled with a `CHAR` type. However, descriptions can vary significantly in length, so they are assigned the `TEXT` type.
The query below creates a `books` table and inserts some sample data:
```sql
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title CHAR(50),
description TEXT
);
INSERT INTO books (title, description)
VALUES
('Postgres Guide', 'A comprehensive guide to PostgreSQL.'),
('Data Modeling Essentials', NULL),
('SQL for Professionals', 'An in-depth look at advanced SQL techniques.');
```
To find books with descriptions, you can use the following query:
```sql
SELECT title
FROM books
WHERE description IS NOT NULL;
```
This query returns the following:
```text
title
----------------------------------------------------
Postgres Guide
SQL for Professionals
```
## Other examples
### String functions and operators
Postgres provides various functions and operators for manipulating character data. For instance, the `||` operator concatenates strings.
The query below joins the title and description columns together:
```sql
SELECT title || ' - ' || description AS full_description
FROM books;
```
This query returns the following:
```text
full_description
----------------------------------------------------------------------
Postgres Guide - A comprehensive guide to PostgreSQL.
SQL for Professionals - An in-depth look at advanced SQL techniques.
```
For more string functions and operators, see [PostgreSQL String Functions and Operators](https://www.postgresql.org/docs/current/functions-string.html).
### Pattern matching
With `VARCHAR` and `TEXT`, you can use pattern matching to find specific text. The `LIKE` operator is commonly used for this purpose.
```sql
SELECT id, title
FROM books
WHERE title LIKE 'Data%';
```
This returns books whose titles start with "Data".
```text
id | title
----+----------------------------------------------------
2 | Data Modeling Essentials
```
## Additional considerations
- **Performance**: There are no significant performance differences between any of the types. Using fixed/limited length types, `CHAR` and `VARCHAR` can be useful for data validation.
- **Function Support**: All character types support a wide range of functions and operators for string manipulation and pattern matching.
## Resources
- [PostgreSQL Character Types documentation](https://www.postgresql.org/docs/current/datatype-character.html)