
4.2 字符串类型
字符串类型用来存储字符串数据。
4.2.1 字符串类型分类
PostgreSQL提供了3种基础的字符串类型:character(简写“char”)、character varying(简写“varchar”)和text,如表4-8所示。
表4-8 字符串类型

character(n)占用的存储空间是固定的,其中正整数n表示最多存储n个字符。
● 如果输入的字符串长度超过n,则PostgreSQL会抛出对应错误。
● 如果字符串长度比n短,则数据库会自动使用空格填满,不管存储还是查询显示时都是如此。但是,末尾的空格被当作是没有意义的,在比较两个character类型值时不会考虑最后的空格。
character varying(n)和text都适用于存储长度可变的文本,根据每行记录的长度分配相应的存储空间,两者主要区别在于长度n的限制。对于character varying(n)来说,正整数n同样表示最多存储n个字符的字符串。
【举例】字符类型的基本操作,代码如下:

4.2.2 使用连接运算符
连接运算符可以作用于所有字符串类型,如表4-9所示。对于字符串类型来说,自动填充的空格对连接没有任何影响,连接时会被自动去掉。
表4-9 连接运算符

【举例】连接运算符的基本操作,代码如下:

4.2.3 使用模式匹配运算符
PostgreSQL提供了3种独立实现模式匹配的方法:LIKE运算符、SIMILAR TO运算符和POSIX正则表达式。
1.LIKE运算符
LIKE运算符语法格式如下:

如果string能够匹配提供的pattern,则LIKE表达式返回“true(真)”。如果string不能匹配提供的pattern,则NOT LIKE表达式返回“true(真)”。
【举例】LIKE运算符的基本操作,代码如下:

LIKE运算符总是覆盖整个字符串。因此,要匹配在字符串中任何位置的序列,该模式必须以百分号开头和结尾。在pattern中的下画线(_)表示匹配任何单个字符;百分号(%)表示匹配零或更多个字符的序列。如果pattern不包含百分号或下画线,则该模式只表示它本身的字符串;这时,LIKE运算符的作用相当于等号运算符。
为了匹配“_”和“%”字符本身,在相应的模式匹配字符串中,这两个字符必须冠以转义字符。默认的转义字符是反斜线(\)。如果想使用其他转义字符,则需要使用ESCAPE子句进行声明。如果想匹配转义字符自身,则连续写两个转义字符。
【举例】匹配“_”“%”和“\”,代码如下:

2.SIMILAR TO运算符
SIMILAR TO运算符的语法格式如下:

SIMILAR TO运算符根据自己的模式是否匹配字符串,而返回“true(真)”或“false(假)”。SIMILAR TO运算符和LIKE运算符非常类似,只不过它使用SQL标准定义的正则表达式模式。
SIMILAR TO运算符只有在它的模式匹配整个字符串时才能成功,这一点和普通正则表达式的行为不同。在普通正则表达式中,模式匹配字符串的任意部分。和LIKE运算符类似的地方还有,SIMILAR TO运算符分别使用“_”和“%”表示任意单个字符和任意字符串的通配符。
SIMILAR TO运算符支持下面POSIX正则表达式的模式匹配元字符。
●|:表示选择。
●*:表示重复前面的项零次或更多次。
●+:表示重复前面的项一次或更多次。
●?:表示重复前面的项零次或一次。
● {m}:表示重复前面的项m次。
● {m,}:表示重复前面的项m次或更多次。
● {m,n}:表示重复前面的项至少m次,且不超过n次。
可以使用圆括号()将多个项组合成一个逻辑项。
一个方括号表达式[...]声明一个字符类,就像POSIX正则表达式一样。
【举例】SIMILAR TO运算符的基本操作,代码如下:

3.POSIX正则表达式
表4-10列出了可用于POSIX正则表达式模式匹配的运算符。
表4-10 正则表达式匹配运算符

正则表达式是一个字符序列,它是一个字符串集合的缩略定义。如果一个字符串是正则表达式描述的正则集合中的一员,那我们就说这个字符串匹配该正则表达式。如果正则表达式不含有特殊字符,那它和LIKE一样,模式字符串精确地匹配目标字符串。正则表达式使用的特殊字符和LIKE不同,而且正则表达式允许匹配字符串的任何位置,除非该正则表达式定位在字符串的开头或结尾。
【举例】使用POSIX正则表达式模式匹配的运算符,代码如下:
