Sling Academy
Home/PostgreSQL/CHAR, VARCHAR, and TEXT data types in PostgreSQL: What’s the difference?

CHAR, VARCHAR, and TEXT data types in PostgreSQL: What’s the difference?

Last updated: January 04, 2024

Overview

Understanding the difference between CHAR, VARCHAR, and TEXT data types in PostgreSQL is crucial for efficient database schema design. This tutorial delves into their distinct features with practical code examples.

Introduction to Data Types

In PostgreSQL, data types are an essential concept that defines the type of data that can be stored in a column. When it comes to storing text, the database provides several options, including CHAR, VARCHAR, and TEXT. Choosing the appropriate data type is important for data integrity, performance, and efficient storage.

Now let’s briefly look at each data type:

  • CHAR (Character): This is a fixed-length data type. If the string you store is shorter than the declared length, PostgreSQL will pad it with spaces. Excessive use of CHAR can lead to wasted space if used incorrectly.
  • VARCHAR (Character Varying): This type represents variable-length strings. You can set a maximum length, or leave it unbounded. It avoids space-padding behavior, making it more flexible than CHAR.
  • TEXT: This is a variable unlimited length data type. There’s no length constraint, making it ideal for storing long texts like articles or descriptions.

Code Examples: Basic to Advanced

The following section provides code snippets to showcase the creation and usage of CHAR, VARCHAR, and TEXT data types in PostgreSQL.

Defining Columns with Different Text Types

CREATE TABLE sample_table (
    a_char CHAR(10),
    a_varchar VARCHAR(100),
    a_text TEXT
);

In the example above, we declare a table with one column for each text type. Notice how CHAR has a fixed length, whereas VARCHAR has a specified maximum, and TEXT has none.

Inserting Data into Text Columns

INSERT INTO sample_table(a_char, a_varchar, a_text) VALUES
    ('Short', 'A bit longer text data', 'A very, very, very... (could be very long) long text data.');

When you insert data, CHAR will space-pad ‘Short’ to 10 characters, while VARCHAR and TEXT will store the strings as they are.

Selecting and Displaying Data from Text Columns

SELECT a_char, length(a_char),
       a_varchar, length(a_varchar),
       a_text, length(a_text)
FROM sample_table;

This query will display the text as well as its actual length, showcasing the padding behavior only in the CHAR type.

Advanced Searching with LIKE Operator

SELECT *
FROM sample_table
WHERE a_text LIKE '%very long text%';

This illustrates an advanced search operation demonstrating that all text types support similar pattern matching, despite their storage differences.

Performance Implications of Text Types

Further into the advanced spectrum, a discussion of performance implications can occur here—benchmarking how the different types might affect query times, especially during joins or text searches on large datasets.

Best Practices for Using CHAR, VARCHAR, and TEXT

Based on the characteristics of each type:

  • Use CHAR when you have data that is always of a fixed length, like country codes.
  • VARCHAR is best for most general purposes where the text length may vary, like names or addresses.
  • Use TEXT for storing large blocks of text where length is unpredictable, such as comments or JSON-encoded data fields.

Modifying Column Types

ALTER TABLE sample_table
ALTER COLUMN a_char TYPE VARCHAR(10);

This snippet shows how to change a CHAR column to VARCHAR, which might be needed if initial length constraints are not applicable anymore.

It’s also worth exploring the implications of such changes on the existing data, performance, and triggers.

Handling Text Types with Functions and Operators

PostgreSQL offers various functions and operators for manipulating text data. Here, we can touch on practical functions such as substring, char_length, trim, and operators including || for concatenation.

SELECT TRIM(a_char), CHAR_LENGTH(a_varchar), SUBSTRING(a_text FROM 1 FOR 100)
FROM sample_table;

In this example, we demonstrate how to clean padded spaces from CHAR, get the length of a VARCHAR, and extract a portion of TEXT data.

Conclusion

In conclusion, while CHAR, VARCHAR, and TEXT may seem similar at first glance, each serves different use cases that hinge on storage requirements, search efficiencies, and length constraints. By understanding the nuances of each, you can optimize your PostgreSQL database schemas for better performance and reliability.

Next Article: Boolean data type in PostgreSQL: How to store true/false values

Previous Article: JSON data type in PostgreSQL: How to store JSON data

Series: PostgreSQL Tutorials: From Basic to Advanced

PostgreSQL

You May Also Like

  • PostgreSQL with TimescaleDB: Querying Time-Series Data with SQL
  • PostgreSQL Full-Text Search with Boolean Operators
  • Filtering Stop Words in PostgreSQL Full-Text Search
  • PostgreSQL command-line cheat sheet
  • How to Perform Efficient Rolling Aggregations with TimescaleDB
  • PostgreSQL with TimescaleDB: Migrating from Traditional Relational Models
  • Best Practices for Maintaining PostgreSQL and TimescaleDB Databases
  • PostgreSQL with TimescaleDB: Building a High-Performance Analytics Engine
  • Integrating PostgreSQL and TimescaleDB with Machine Learning Models
  • PostgreSQL with TimescaleDB: Implementing Temporal Data Analysis
  • Combining PostgreSQL, TimescaleDB, and Airflow for Data Workflows
  • PostgreSQL with TimescaleDB: Visualizing Real-Time Data with Superset
  • Using PostgreSQL with TimescaleDB for Energy Consumption Analysis
  • PostgreSQL with TimescaleDB: How to Query Massive Datasets Efficiently
  • Best Practices for Writing Time-Series Queries in PostgreSQL with TimescaleDB
  • PostgreSQL with TimescaleDB: Implementing Batch Data Processing
  • Using PostgreSQL with TimescaleDB for Network Traffic Analysis
  • PostgreSQL with TimescaleDB: Troubleshooting Common Performance Issues
  • Building an IoT Data Pipeline with PostgreSQL and TimescaleDB