PostgreSQL支持的字符类型如表所示。
character varying(n)存储的是变长字符类型,n是一个正整数,如果存储的字符串长度超出n则报错;如果存储的字符串长度比n小,character varying(n)仅存储字符串的实际位数。character(n)存储定长字符,如果存储的字符串长度超出n则报错;如果存储的字符串长度比n小,则用空白填充。为了验证此特性,下面做个实验,创建一张测试表,并插入一条测试数据,代码如下所示:
mydb=> CREATE TABLE test_char(col1 varchar (4), col2 character(4));
CREATE TABLE
mydb=> INSERT INTO test_char(col1, col2) VALUES ('a', 'a');
INSERT 0 1
表test_char的字段col1类型为character varying(4), col2类型为character(4),接下来计算两个字段值的字符串长度,代码如下所示:
mydb=> SELECT char_length(col1), char_length(col2) FROM test_char ;
char_length | char_length
----------------+-------------
1 | 1
(1 row)
char_length(string)显示字符串字符数,从上面结果可以看出字符串长度都为1,接着查看两字段实际占用的物理空间大小,代码如下所示:
mydb=> SELECT octet_length(col1), octet_length(col2) FROM test_char ;
octet_length | octet_length
-----------------+--------------
1 | 4
(1 row)
octet_length(string)显示字符串占用的字节数,col2字段占用了4个字节,正好是col2字段定义的character长度。
值得一提的是character varying(n)类型如果不声明长度,将存储任意长度的字符串,而character(n)如果不声明长度则等效于character(1)。
text字符类型存储任意长度的字符串,和没有声明字符长度的character varying字符类型几乎没有差别。
提示:PostgreSQL支持最大的字段大小为1GB,虽然文档上说没有声明长度的character varying和text都支持任意长度的字符串,但仍受最大字段大小1GB的限制;此外,从性能上考虑这两种字符类型几乎没有差别,只是character(n)类型当存储的字符串长度不够时会用空白填充,这将带来存储空间一定程度的浪费,使用时需注意。
PostgreSQL支持丰富的字符函数,下面举例说明。计算字符串中的字符数,如下所示:
mydb=> SELECT char_length('abcd');
char_length
-------------
4
(1 row)
计算字符串占用的字节数,如下所示:
mydb=> SELECT octet_length('abcd');
octet_length
--------------
4
(1 row)
指定字符在字符串的位置,如下所示:
mydb=> SELECT position('a' in 'abcd');
position
----------
1
(1 row)
提取字符串中的子串,如下所示:
mydb=> SELECT substring('francs' from 3 for 4);
substring
-----------
ancs
(1 row)
拆分字符串,split_part函数语法如下:
split_part(string text, delimiter text, field int)
根据delimiter分隔符拆分字符串string,并返回指定字段,字段从1开始,如下所示:
mydb=> SELECT split_part('abc@def1@nb', '@',2);
split_part
------------
def1
(1 row)