PostgreSQL中的char类型

版权声明:本文为博主原创之文章,未经博主允许谢绝转载。 https://blog.csdn.net/pg_hgdb/article/details/82461961

SQL定义了两种基本的字符类型: character varying(n)和character(n), 其中n是一个正整数。两种类型都可以存储最多n个字符的字符串。另外,PostgreSQL提供text类型,它可以存储任何长度的串。varchar(n)和char(n)分别是character varying(n)和character(n)的别名。 char(n)很少被使用,因为使用这种数据类型有时会产生一些意料之外的行为。

首先,char是固定长度类型。 当字符数据存储在其中时,如果它不是全长,则用空格填充:

postgres=# create table chartest (a char(10));
CREATE TABLE
postgres=# insert into chartest values('b');
INSERT 0 1
postgres=# select * from chartest ;
     a      
------------
 b         
(1 row)

类型character尾部的空白是没有意义的,并且在比较两个 character类型值时不会考虑它们。

postgres=# select length(a) from chartest ;
 length 
--------
      1
(1 row)

但是有些情况下,结果会比较特殊。当把一个character值转换成其他字符串类型之一时,拖尾的空白会被移除。这样固定长度的类型就会表现得像是可变长度类型。然而,在character varying和text值里, 结尾的空白语意上是有含义的,并且在使用模式匹配(如LIKE和正则表达式)时也会被考虑。

postgres=# select substring(a from 8 for 1) = ' '::char(1) from chartest ;
 ?column? 
----------
 t
(1 row)

postgres=# select substring(a from 8 for 1) = ' '::varchar(1) from chartest ;
 ?column? 
----------
 f
(1 row)

postgres=# select length(substring(a from 8 for 1)) from chartest ;
 length 
--------
      0
(1 row)

对于n> 1的情况,建议使用VARCHAR或TEXT数据库类型。在PostgreSQL中,VARCHAR和TEXT以相同的方式存储。

 

By Kalath

猜你喜欢

转载自blog.csdn.net/pg_hgdb/article/details/82461961
今日推荐