PostgreSQL Character Types: CHAR, VARCHAR, and TEXT

PostgreSQL—CHAR, VARCHAR, and TEXT—each catering to different storage needs and performance considerations. Understanding the distinctions between the

In the world of relational databases, PostgreSQL stands out as a robust and versatile option, offering a wide array of data types to accommodate different needs. When it comes to storing textual data, PostgreSQL provides several character types, each with its own characteristics and use cases. 

PostgreSQL Character Types: CHAR, VARCHAR, and TEXT

In this article, we'll delve into PostgreSQL character types—CHAR, VARCHAR, and TEXT—exploring their differences, advantages, and best practices for usage.

Introduction to the PostgreSQL character types 

In the realm of PostgreSQL character types, there exist three key players, each with its unique flair, catering to diverse needs

Character Type Description
CHAR(n) Fixed-length character type.
VARCHAR(n) Variable-length character type with a maximum length of n characters.
TEXT Variable-length character type for storing large textual content.

Let's understand these types in depth:


CHAR is a fixed-length character type in PostgreSQL, meaning that it stores strings of a predetermined length. When you define a column with CHAR, you specify the maximum number of characters it can hold. If the actual string is shorter than the specified length, PostgreSQL pads it with spaces to fill the allocated space.

For example, defining a column as CHAR(10) reserves 10 characters for each value, even if the inserted string is shorter. This can lead to wastage of storage space if most values are shorter than the defined length.

While CHAR might seem rigid due to its fixed-length nature, it offers performance benefits in certain scenarios. Queries involving CHAR columns can be faster than VARCHAR or TEXT columns, especially for fixed-length data comparisons.


Unlike CHAR, VARCHAR is a variable-length character type in PostgreSQL. It allows you to store strings of varying lengths, optimizing storage by using only as much space as needed for each value. When you define a column as VARCHAR, you specify the maximum length it can hold, but it will only use the necessary space to store actual data.

For example, VARCHAR(100) can store strings with a maximum length of 100 characters, but it will consume less storage for shorter strings compared to CHAR.

VARCHAR is a flexible choice for storing textual data, as it efficiently manages storage space without sacrificing performance. However, it's essential to choose an appropriate maximum length to balance storage efficiency and data integrity.


TEXT is another variable-length character type in PostgreSQL, offering even greater flexibility than VARCHAR. It can store strings of virtually unlimited length, accommodating large textual data such as documents, articles, or logs.

While TEXT lacks an explicit length limit like VARCHAR, it still imposes a practical limit based on system constraints. However, it's generally more than sufficient for most applications' needs.

TEXT is ideal for storing large textual content where the exact length is unpredictable or when you need to handle extensive text data efficiently. It simplifies database management by eliminating the need to specify a maximum length for each column.

PostgreSQL Character Type Example

Let's create a table with columns of CHAR, VARCHAR, and TEXT data types and insert some sample data to understand how they work:

-- Create a table with CHAR, VARCHAR, and TEXT columns
CREATE TABLE char_varchar_text_example (
    char_column CHAR(10),
    varchar_column VARCHAR(15),
    text_column TEXT

-- Insert sample data into the table
INSERT INTO char_varchar_text_example (char_column, varchar_column, text_column) 
    ('John', 'New York', 'This is a sample text for John in New York.'),
    ('Alice', 'Paris', 'This is a sample text for Alice in Paris.'),
    ('Bob', 'Tokyo', 'This is a sample text for Bob in Tokyo.');

-- Retrieve data from the table
SELECT * FROM char_varchar_text_example;


 id | char_column | varchar_column |          text_column          
  1 | John        | New York       | This is a sample text for John in New York.
  2 | Alice       | Paris          | This is a sample text for Alice in Paris.
  3 | Bob         | Tokyo          | This is a sample text for Bob in Tokyo.

In this example, the CHAR(10) column (char_column) stores fixed-length character strings up to 10 characters long. It pads shorter strings with spaces. The VARCHAR(15) column (varchar_column) stores variable-length character strings up to 15 characters long without padding. The TEXT column (text_column) stores variable-length character strings of unlimited length.

Choosing the Right Character Type

Selecting the appropriate character type depends on the specific requirements of your application:

  • Use CHAR when dealing with fixed-length data and performance is critical for your use case.
  • Choose VARCHAR for variable-length data with a reasonably predictable maximum length, balancing storage efficiency and flexibility.
  • Opt for TEXT when dealing with large textual content or when the exact length is unpredictable.

Best Practices

  • Analyze your data requirements carefully before choosing a character type to avoid unnecessary storage overhead or performance bottlenecks.
  • Consider the expected length and frequency of updates when determining the maximum length for VARCHAR columns.
  • Regularly monitor and optimize storage usage, especially for columns with fixed-length data, to avoid unnecessary resource consumption.


PostgreSQL offers a versatile range of character types—CHAR, VARCHAR, and TEXT—each catering to different storage needs and performance considerations. Understanding the distinctions between these types empowers database designers to make informed decisions based on their specific requirements. By choosing the right character type and adhering to best practices, you can efficiently manage textual data in PostgreSQL databases, ensuring optimal performance and storage utilization for your applications.