字符数据类型 在任何数据库中,字符数据类型可能是最广泛使用的类型。有三种字符数据类型,用于表示以下字符变量: 有很多标准的SQL字符类型,但PostgreSQL也支持text类型,它类似于变长字符串,除了我们不需要定义任何上限来限制长度。但是这不是标准的SQL类型,所以要小心使用它。标准的类型可以使用char,char(n)和varchar(n)定义。表8-2列出了PostgreSQL的字符类型。 表8-2 PostgreSQL字符类型 如果让你选择三个标准类型用于存储字符串,你会选哪一个?通常,没有正式的答复。如果你知道你的数据库只会用在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; ————+—————+—————— test=> SELECT fixedchar, length(fixedchar), variablechar FROM testtype (1 row) test=> SELECT fixedchar, length(fixedchar), variablechar FROM testtype 解析 我们建立了一个有三列的表,每个列对应一个标准的SQL类型。列singlechar保存单个的字符,fixedchar列保存刚好13个字符长度的字符串,variablechar列保存最长不超过128自己的字符串。我们然后储存不同的数据到几个列中,然后再检索它们一查看PostgreSQL是否正确存储了数据,虽然是在psql的输出中,你实际上看不到填充的字符。 我们尝试插入一个超过fixedchar列的字符串。这产生了一个错误,没有数据被插入。 我们检索了fixedchar列中字符串长度不同的行,使用内建的函数length()来检查它的大小。我们会在之后章的“用于数据操作的有用函数”小节中学习一些其他的用于操作数据的函数。 注:在PostgreSQL 8.0版本之前,length()函数在本例中总会返回13,因为存储类型char(n)是定长的且数据总是由空白填充了的,但是现在,length()函数忽略哪些空格并返回一个更有用的结果。
|