类型 | 描述 |
---|---|
character varying(n) 或 varchar(n) | 变长字符串类型,最大空间1GB,存储空间4+实际的字符串长度。与MySQL中的varchar(n)或text(n),以及Oracle中的varchar2(n)类似,但是在MySQL中varchar最多只有64KB,Oracle中的varchar2最多只有4000字节。 |
character(n)或char(n) | 定长字符串类型,不足空白补充。最大1GB,存储空间4+n |
text | 变长字符串类型。无长度限制,与MySQL中的LONGTEXT类似 |
varchar(n) 在没有指定 n 的值时,表示可以接受1GB内的任何长度的字符串,建议加上 n
char(n) 在没有指定 n 值时,表示 char(1) ,
不管varchar还是char类型最小存储空间时4字节。而在Postgresql数据库中varchar和char指定长度过长时,实际在字段中存储的可能只是一个指针,具体内容会存储在toast表中,指针便于对字段值的快速访问。
在一些其他种类的数据库中定长的char有一定的优势。但是在postgresql中没有什么差别。大多数还是会用varchar或text。
支持标准的SQL字符串的函数和操作符:
函数 | 返回类型 | 描述 | 例子 | 结果 |
---|---|---|---|---|
string ll string | text | 字符串链接 | selec ‘abc’ ll ‘EFG’; | ‘abcEFG’ |
length(string) | int | string 中字符的个数,主要区分的是中文和英文不同 | select length(‘abc’) | 3 |
bit_length(string) | int | 字符串二进制位长度(个数) | select bit_length(‘jack’); | 32 |
char_length(string)或character_length(string) | int | 字符串中字符的个数 | select char_length(‘jack’); | 4 |
octet_length(string) | int | 字符串中的字节数 | select octet_length(‘jack’); | 4 |
convert(string using conversion_name) | test | 使用指定的转换名字改变编码。转换可以通过CREATE CONVERSION定义,系统中也有一些预定义的转换名字 | select convert(‘Postgresql’ using iso_8859_1_to_utf8); | UTF8编码的Postgresql |
convert( string text, [ src_encoding name, ], dest_encoding name ) | text | 把字符串原来编码位 src_encoding 转成 dest_encoding 编码。如果没有指定src_encoding,则src_encoding为数据库编码 | select convert( ‘abc’, ‘UTF8’, ‘GBK’ ) | 以GBK编码的abc |
lower(string) | text | 把所有的字符串转成小写 | select lower(‘TOM’); | tom |
upper(string) | text | 把所有字符串转成大写 | select upper(‘tom’); | TOM |
initcap(string) | text | 将字符串中每个单词的第一个字符转为大写,其他变为小写(字符串中区分单词:非字符数字分割) | initcap(‘hi jack’) | Hi Jack |
overlay(string placing string from int[for int]) | text | 指定子字符串替换的范围,例子里时用 hom 字符串替换 Txxxxas 中从第2个字符开始的4个字符,如果没有指定 for int ,int 是子字符串的长度 | select overlay(‘Txxxxas’ placing ‘hom’ from 2 for 4); | Thomas |
position( substring in string ) | int | 查找substring 在 string 中的起始位置 | select position( ‘om’ in ‘Thomas’); | 3 |
strpos(string , substring) | int | 查找指定的子字符串substring在string中的起始位置 | select strpos(‘helloworld’ ,‘llo’); | 3 |
substring(string, from [, count] ) | text | 截取string中指定位置from的指定长度count的子字符串 | select substring ( ‘jack’ , 2, 2) | ac |
substring(string from int for int ) | text | 抽取指定位置(from int )开始指定个数(for int)的字符串,如果没有指定 for int 则从指定位置一直到结束全部截取 | select substring( ’ Thomas’ from 2 for 3 ); | hom |
substring(string from pattern) | text | 截取匹配posix正则表达式的字符串 | select substring(‘hello world’ from ‘…$’); | rld |
substring(string from pattern for escape) | text | 截取匹配posix正则表达式的字符串,for为转移字符 | select substring(‘Thomas’ from ‘%#“o_a#”_’ for ‘#’); | oma |
replace(string text, from text, to text ) | text | 把字符串string中所有出现的from 都替换成 to | select replace(‘abcddggdd’,‘d’,‘5’) | abc55gg55 |
ascii(string) | int | 字符串中第一个字符的ASCII码 | select ascii(‘abc’) | 97 |
chr(int) | text | 给出ASCII码所对应的字符 | select chr(97) | a |
decode(string text, type text ) | bytea | 把早先用encode编码的string里面的二进制数据解码,支持类型:base64、hex、escape | ||
encode(data bytea, type text) | text | 把二进制数据编码位只包含ASCII形式的数据,支持类型与decode类似 | ||
lpad(string text, length int [, fill text] ) | text | 通过在指定的string左边填充字符 fill (不指定默认空白),把string填充为指定的length长度,如果string长度比指定的length长,则将其尾部截断,例子里是将字符串 OK 左边使用 1 填充直到长度为5 | select lpad( ‘OK’, ‘5’, ‘1’) | 111OK |
rpad(string text, length int [, fill text] ) | text | 通过在指定的string右边填充字符 fill (不指定默认空白),把string填充为指定的length长度,如果string长度比指定的length长,则将其尾部截断,例子里是将字符串 OK 右边使用 1 填充直到长度为5 | select rpad( ‘OK’, ‘5’, ‘1’) | OK111 |
btrim( string text [ , character text ] ) | text | 从string的开头和结尾删除含有 character 中的字符,不指定character默认空格 | select btrim( ‘aajackaaaa’, ‘aa’ ) | jack |
ltrim( string text [ , character text ] ) | text | 从string的开头(左边)删除含有 character 中的字符,不指定character默认空格 | select btrim( ‘aajackaaaa’, ‘aa’ ) | jackaaaa |
rtrim( string text [ , character text ] ) | text | 从string的结尾(右边)删除含有 character 中的字符,不指定character默认空格 | select btrim( ‘aajackaaaa’, ‘aa’ ) | aajack |
quote_ident(string) | text | 返回适用于SQL语句的标识符形式(使用适当的引号进行界定),只有在必要的时候才会添加引号(字符串包含非标识符字符或者会转换大小写的字符),嵌入的引号会被恰当的写双份 | ||
quote_literal(string) | text | 返回适用于在SQL语句里当作文本的形式,嵌入的引号和反斜杠被恰当的写双份 | ||
pg_client_encoding() | name | 当前客户端编码名称 | select pg_client_encoding(); | UTF8 |
repeat(string text, number int ) | text | 将string重复number次 | select repeat( ‘abc’, 2); | abcabc |
split_part(string text, delimiter text, field int) | text | 根据delimiter分隔string,返回生成第 field 个字符串 | split_part( ‘123#456#789’, ‘#’, 2 ) | 456 |
regexp_replace(string text, pattern text, replacement text [ , flages text ]) | text | 替换匹配POSIX正则表达式的子字符串 |
字符串length类似函数用法:
postgres=# select length('abcd');
length
--------
4
(1 row)
postgres=# select octet_length('abcd');
octet_length
--------------
4
(1 row)
postgres=# select bit_length('abcd');
bit_length
------------
32
(1 row)
postgres=# select length('测试');
length
--------
2
(1 row)
postgres=# select octet_length('测试');
octet_length
--------------
6
(1 row)
postgres=# select bit_length('测试');
bit_length
------------
48
(1 row)