PostgreSQL Error 22026: string data length mismatch
PostgreSQL error code 22026 (string data length mismatch) occurs when the actual length of string data does not match the expected or required length defined for a column or data type. This error belongs to SQL standard class 22 (Data Exception) and is most commonly encountered with fixed-length types like CHAR(n) and BIT(n), or when exchanging data through binary protocols, COPY commands, or Foreign Data Wrappers (FDW). Understanding the root cause is essential, as this error directly impacts data integrity in production systems.
Top 3 Causes
1. Binary COPY with mismatched column lengths
When using COPY ... WITH (FORMAT BINARY), PostgreSQL encodes the string length in the binary stream. If the source data was exported from a CHAR(10) column but the target table defines the column as CHAR(8), a length mismatch error is thrown immediately.
-- This will fail if the binary file was created from a CHAR(10) column
COPY your_table (id, fixed_col)
FROM '/data/export.bin'
WITH (FORMAT BINARY);
-- Quick fix: switch to TEXT/CSV format
COPY your_table (id, fixed_col)
FROM '/data/export.csv'
WITH (FORMAT CSV, HEADER true);
-- Or use a staging table with TEXT type first
CREATE TEMP TABLE staging (id INT, fixed_col TEXT);
COPY staging FROM '/data/export.csv' WITH (FORMAT CSV, HEADER true);
INSERT INTO your_table (id, fixed_col)
SELECT id, fixed_col::CHAR(8)
FROM staging
WHERE char_length(trim(fixed_col)) <= 8;
2. Inserting wrong-length values into BIT(n) columns
Unlike VARCHAR, BIT(n) requires exactly n bits. Inserting a bit string of any other length triggers error 22026. This is a common pitfall when working with bitmask flags or binary encoded data from external systems.
-- This will raise ERROR 22026
-- INSERT INTO bit_flags (flags) VALUES (B'101'); -- only 3 bits for BIT(8)
-- Fix 1: pad the bit string to the correct length
INSERT INTO bit_flags (flags)
VALUES (lpad('101', 8, '0')::BIT(8));
-- Fix 2: use BIT VARYING(n) for flexible-length bit strings
ALTER TABLE bit_flags
ALTER COLUMN flags TYPE BIT VARYING(8);
-- Now shorter bit strings are accepted
INSERT INTO bit_flags (flags) VALUES (B'101');
3. Type mapping errors in Foreign Data Wrappers (FDW)
When using FDWs like postgres_fdw or oracle_fdw, if the remote column is defined as CHAR(20) but the local foreign table maps it to CHAR(10), fetching or pushing data will raise 22026. The fix is to relax the local column type to TEXT and handle length enforcement locally.
-- Relax the foreign table column type to TEXT
ALTER FOREIGN TABLE remote_customers
ALTER COLUMN customer_code TYPE TEXT;
-- Apply length validation when inserting into local table
INSERT INTO local_customers (id, customer_code)
SELECT id,
LEFT(customer_code, 10)::CHAR(10)
FROM remote_customers
WHERE customer_code IS NOT NULL;
-- Verify column definitions on both sides
SELECT column_name, data_type, character_maximum_length
FROM information_schema.columns
WHERE table_name = 'remote_customers';
Quick Fix Solutions
-
Switch from binary to text format in
COPYoperations when length mismatches are suspected. -
Use
BIT VARYING(n)instead ofBIT(n)when exact bit-length enforcement is not required. -
Always stage external data into
TEXTcolumns first, then cast and validate before inserting into fixed-length columns. - Align column definitions between source and target systems before running data migrations.
-- Check all fixed-length columns in your database
SELECT table_name, column_name, data_type, character_maximum_length
FROM information_schema.columns
WHERE table_schema = 'public'
AND data_type IN ('character', 'bit')
ORDER BY table_name;
Prevention Tips
Use staging tables with TEXT columns for all external data ingestion. Validate lengths programmatically before casting to fixed-length types. This decouples data loading from schema enforcement.
Document and centrally manage column length definitions across all integrated systems. When a schema change is needed, always audit downstream consumers and FDW mappings. Use
information_schema.columnsqueries to automate schema drift detection in your CI/CD pipeline.
Related Errors
-
22001 –
string_data_right_truncation: Data exceeds the maximum column length. -
22P02 –
invalid_text_representation: Invalid format when casting strings to specific types, often seen alongside 22026 with BIT types. -
42804 –
datatype_mismatch: Full type incompatibility, not just length.
📖 Want a more detailed guide?
Check out the full in-depth version (Korean) on oraerror.com — includes detailed analysis, additional SQL examples, and prevention tips.
Top comments (0)