PostgreSQL从菜鸟到专家系列教程(8)数据定义 字符数据类型

发布时间:2020-06-07编辑:脚本学堂
PostgreSQL从菜鸟到专家系列教程(8)数据定义 字符数据类型

字符数据类型

在任何数据库中,字符数据类型可能是最广泛使用的类型。有三种字符数据类型,用于表示以下字符变量:
1. 单个字符
2. 固定长度字符串
3. 长度可变字符串

有很多标准的SQL字符类型,但PostgreSQL也支持text类型,它类似于变长字符串,除了我们不需要定义任何上限来限制长度。但是这不是标准的SQL类型,所以要小心使用它。标准的类型可以使用char,char(n)和varchar(n)定义。表8-2列出了PostgreSQL的字符类型。

表8-2 PostgreSQL字符类型
定义  意义
char  单个字符
char(n)  一组长度固定为n的字符,长度不足用空白填充。如果你尝试存储一个过长的字符串,将会发生一个错误。
varchar(n) 一组长度不超过n的字符,长度不足也不需要填充。PostgreSQL扩展了SQL标准,允许指定没有长度的varchar,这实际上使长度不受限制。
text  实际上是一个长度不受限制的字符串,就像varchar一样,只是不需要定义最大长度。这是一个PostgreSQL针对SQL标准做的扩展。

如果让你选择三个标准类型用于存储字符串,你会选哪一个?通常,没有正式的答复。如果你知道你的数据库只会用在PostgreSQL中,你可以使用text类型,因为它很容易使用且不强制要你确定最大长度。它的最大长度只受限于PostgreSQL支持的行的最大大小。如果你使用的是早于7.1版本的PostgreSQL,行的大小限制在8KB(除非你从源码重新编译且改变了它)。从PostgreSQL 7.1开始,已经没有这个限制了。对于PostgreSQL 7.1和以后的版本,一个表中任何单个字段的长度的限制为1GB,实际上你永远不需要那么长的一个字符串。

主要缺点是text类型不是标准类型。所以,如果有很少的可能你有一天需要移植你的数据库到PostgreSQL之外的数据库,你应该避免使用text类型。通常,我们在本书中没有使用text类型,而更趋向于使用更标准的SQL类型varchar和char。

按惯例,char(n)在字符串的长度为固定或者行与行之间有稍微变化的时候使用,varchar(n)在字符串长度明显变化的时候使用。这是因为在一些数据库中,内部存储定长字符串的性能比变长的高很多,即使定长的需要存储一些不必要的字符。但是在内部,PostgreSQL使用相同的机制存储char和varchar类型。所以,对于PostgreSQL,使用哪种类型更多依赖于你自己的个人偏好。如果不同行之间的数据的长度明显不同,可以选择varchar(n)类型。还有,如果你不确定长度,可以使用varchar(n)。

就像boolean类型一样,所有的字符串类型可以包含NULL,除非你明确地定义这个列不允许NULL值。
尝试:使用字符类型

让我们看看PostgreSQL的字符类型如何工作。首先,我们需要删除我们的testtype表,然后我们使用一些不同的列类型重建它:

复制代码 代码如下:

test=> DROP TABLE testtype;
DROP TABLE
test=>
test=> CREATE TABLE testtype (
test(>     singlechar      char,
test(>     fixedchar       char(13),
test(>     variablechar    varchar(128)
test(> );
CREATE TABLE
test=>
test=> INSERT INTO testtype VALUES(‘F’, ’0-349-10177-9′, ‘The Wasp Factory’);
INSERT 17871 1
test=> INSERT INTO testtype VALUES(‘S’, ’1-85723-457-X’, ‘Excession’);
INSERT 17872 1
test=> INSERT INTO testtype VALUES(‘F’, ’0-349-10768-8′, ‘Whit’);
INSERT 17873 1
test=> INSERT INTO testtype VALUES(NULL, ”, ‘T.B.D.’);
INSERT 17874 1
test=> INSERT INTO testtype VALUES(‘L’, ‘A String that is too long’, ‘L’);
ERROR:  value too long for type character(13)
test=>
test=> SELECT * FROM testtype;
singlechar |   fixedchar   |   variablechar

————+—————+——————
F          | 0-349-10177-9 | The Wasp Factory
S          | 1-85723-457-X | Excession
F          | 0-349-10768-8 | Whit
|               | T.B.D.
(4 rows)

test=> SELECT fixedchar, length(fixedchar), variablechar FROM testtype
test-> WHERE singlechar = ‘S’;
fixedchar   | length | variablechar
—————+——–+————–
1-85723-457-X |     13 | Excession

(1 row)

test=> SELECT fixedchar, length(fixedchar), variablechar FROM testtype
test-> WHERE singlechar IS NULL;
fixedchar   | length | variablechar
—————+——–+————–
|      0 | T.B.D.
(1 row)
 
test=>

解析

我们建立了一个有三列的表,每个列对应一个标准的SQL类型。列singlechar保存单个的字符,fixedchar列保存刚好13个字符长度的字符串,variablechar列保存最长不超过128自己的字符串。我们然后储存不同的数据到几个列中,然后再检索它们一查看PostgreSQL是否正确存储了数据,虽然是在psql的输出中,你实际上看不到填充的字符。

我们尝试插入一个超过fixedchar列的字符串。这产生了一个错误,没有数据被插入。

我们检索了fixedchar列中字符串长度不同的行,使用内建的函数length()来检查它的大小。我们会在之后章的“用于数据操作的有用函数”小节中学习一些其他的用于操作数据的函数。

注:在PostgreSQL 8.0版本之前,length()函数在本例中总会返回13,因为存储类型char(n)是定长的且数据总是由空白填充了的,但是现在,length()函数忽略哪些空格并返回一个更有用的结果。

本文转自: http://www.mysqlops.com/2012/05/06/postgresql-date-type-2.html