提要:本教程将介绍 PostgreSQL 的字段类型,包括 CHAR、VARCHAR 和 TEXT。并对设计数据库时,选择使用正确的类型给出一些建议。

简介

PostgreSQL 提供了3种主要的字符类型:CHAR(n)CHARACTER(n)VARCHAR(n)CHARACTER VARYING(n)TEXT,其中的 n 是个正整数。

字符类型 说明
VARCHAR(n)CHARACTER VARYING(n) 有限长度的变长字符
CHAR(n)CHARACTER(n) 有限长度的定长字符,会使用空格填充
TEXT 无限长度的变长字符

CHAR(n)VARCHAR(n) 可以存储指定长度的字符。如果尝试存储超出长度 n 的数据,PostgreSQL 将抛出错误。一个例外是,如果多余的字符都是空格,PostgreSQL 会将空格截断为最大长度并存储字符串。

如果将一个字符串显式地转换为 CHAR(n)VARCHAR(n),在插入表之前,PostgreSQL会将字符串截断为 n 个字符。

理论上,TEXT 可以存储无限长度的字符。

如果没有给 VARCHAR 指定长度,它的行为将和 TEXT 类似。没有指定长度的 VARCHAR 在性能上和 TEXT 一样。

不同的是,如果没有给 CHAR 指定长度,那么它将和 CHAR(1) 的行为类似,也就是说,只能存储一个字段。

和其它数据库不同,在 PostgreSQL 这三种字符类型,在性能上没有差别。(MySQL中,这三种数据类型的性能差异很大)

示例

首先,创建一个表来做演示:

CREATE TABLE character_tests (
 id serial PRIMARY KEY,
 x CHAR (1),
 y VARCHAR (10),
        z TEXT
);

然后,给这张表插入一些示例数据:

INSERT INTO character_tests (x, y, z)
VALUES
 (
 'Yes',
 'This is a test for varchar',
 'This is a very long text for the PostgreSQL text column'
 );

PostgreSQL 报错了:

ERROR:  value too long for type character(1)

这是因为,x 字段的数据类型是 CHAR(1),只能存储一个字符。使用下面的语句修正这错误:

INSERT INTO character_tests (x, y, z)
VALUES
 (
 'Y',
 'This is a test for varchar',
 'This is a very long text for the PostgreSQL text column'
 );

现在,PostgreSQL 报了另一个错误:

ERROR:  value too long for type character varying(10)

这是因为我们尝试插入的数据超出了 y 字段的长度(VARCHAR(10))。下面的语句终于成功了:

INSERT INTO character_tests (x, y, z)
VALUES
 (
 'Y',
 'varchar(n)',
 'This is a very long text for the PostgreSQL text column'
 );
SELECT * FROM character_tests;
 id | x |     y      |                            z
----+---+------------+---------------------------------------------------------
  1 | Y | varchar(n) | This is a very long text for the PostgreSQL text column
(1 row)