postgresql数据库varchar、char、text的比较

news/2024/7/9 23:07:31 标签: postgresql, 数据库, 存储, character, char

名字描述
character>character varying(n), varchar(n)变长,有长度限制
character>character(n), char(n)定长,不足补空白
text变长,无长度限制

简单来说,varchar的长度可变,而char的长度不可变,对于postgresql数据库来说varcharchar的区别仅仅在于前者是变长,而后者是定长,最大长度都是10485760(1GB)

varchar不指定长度,可以存储最大长度(1GB)的字符串,而char不指定长度,默认则为1,这点需要注意。

text类型:在postgresql数据库里边,text和varchar几乎无性能差别,区别仅在于存储结构的不同

对于char的使用,应该在确定字符串长度的情况下使用,否则应该选择varchar或者text


官方解读:

SQL定义了两种基本的字符类型:character>character varying(n)character>character(n),这里的n 是一个正整数。两种类型都可以存储最多n个字符的字符串(没有字节)。试图存储更长的字符串到这些类型的字段里会产生一个错误,除非超出长度的字符都是空白,这种情况下该字符串将被截断为最大长度。这个看上去有点怪异的例外是SQL标准要求的。如果要存储的字符串比声明的长度短,类型为character>character的数值将会用空白填满;而类型为character>character varying的数值将只是存储短些的字符串。

如果我们明确地把一个数值转换成character>character varying(n)character>character(n),那么超长的数值将被截断成n 个字符,且不会抛出错误。这也是SQL标准的要求。

varchar(n)char(n) 分别是character>character varying(n)character>character(n)的别名,没有声明长度的character>character等于character>character(1);如果不带长度说明词使用character>character varying,那么该类型接受任何长度的字符串。后者是PostgreSQL的扩展。

另外,PostgreSQL提供text类型,它可以存储任何长度的字符串。尽管类型text不是SQL 标准,但是许多其它SQL数据库系统也有它。

character>character类型的数值物理上都用空白填充到指定的长度n,并且以这种方式存储和显示。不过,填充的空白是无语意的。在比较两个character>character 值的时候,填充的空白都不会被关注,在转换成其它字符串类型的时候, character>character值里面的空白会被删除。请注意,在character>character varyingtext数值里,结尾的空白是有语意的。并且当使用模式匹配时,如LIKE,使用正则表达式。

一个简短的字符串(最多126个字节)的存储要求是1个字节加上实际的字符串,其中包括空格填充的character>character。更长的字符串有4个字节的开销,而不是1。长的字符串将会自动被系统压缩,因此在磁盘上的物理需求可能会更少些。更长的数值也会存储在后台表里面,这样它们就不会干扰对短字段值的快速访问。不管怎样,允许存储的最长字符串大概是1GB 。允许在数据类型声明中出现的n 的最大值比这还小。修改这个行为没有什么意义,因为在多字节编码下字符和字节的数目可能差别很大。如果你想存储没有特定上限的长字符串,那么使用text 或没有长度声明的character>character varying,而不要选择一个任意长度限制。

提示: 这三种类型之间没有性能差别,除了当使用填充空白类型时的增加存储空间,和当存储长度约束的列时一些检查存入时长度的额外的CPU周期。虽然在某些其它的数据库系统里,character>character(n) 有一定的性能优势,但在PostgreSQL里没有。事实上,character>character(n)通常是这三个中最慢的,因为额外存储成本。在大多数情况下,应该使用textcharacter>character varying




http://www.niftyadmin.cn/n/1727586.html

相关文章

postgresql数据库使用函数查询所有符合条件的表名,以及删除所有查询到的表的数据

查询所有符合条件的表名: (我这里的条件是所有以“tbl_”开头除过“tbl_user"的所有表名) create or replace function query_all_table_name() returns setof varchar as $$declareselect_result record;beginfor select_result inse…

【Leetcode】图算法总结

Leetcode中图的算法是比较常见的类型,比如无向图的单源最短路径,有向图的单源最短路径,多源最短路径等问题,下面就对图的算法进行总结。 文章目录单源最短路径:Dijkstra算法743. 网络延迟时间拓扑排序210. 课程表 II20…

华为机试:最小传输时延

【编程题目 | 200分】最小传输时延 [ 200 / 中等 ] 题目描述 某通信网络中有N个网络结点,用1到N进行标识。网络通过一个有向无环图表示,其中图的边的值表示结点之间的消息传递时延。现给定相连节点之间的时延列表times[i]{u,v,w…

Flink内核源码(四)内存管理

最近在学习了尚硅谷的Flink内核源码解析,内容很多,因此想要整理学习一下。Flink的版本是1.12.0。 第四章就来从源码层面学习一下Flink的内存管理机制。 问题整理: 1. JVM内存管理有什么不足? 2. Flink的内存管理机制是怎样的&a…

Linux 使用expect工具和scp命令实现自动复制传输文件

新建copy_file.exp文件 文件内容如下: #!/usr/expect/bin/expect############################################################# # # # 1.Copy install-package to destination host …

expect调用shell命令或shell脚本

expect调用shell命令 获取本机IP: set idcid [exec sh -c {ifconfig eth0 | grep Mask | cut -d: -f2 | awk {print $1}}] 调用shell脚本test.sh set testResult [exec sh -c {./test.sh}] 参考资料:https://www.linuxquestions.org/questions/linux…

华为机试:叠积木

【编程题目 | 200分】叠积木 [ 200 / 中等 ] 题目描述 有一堆长方体积木,它们的长度和宽度都相同,但长度不一。 小橙想把这堆积木叠成一面墙,墙的每层可以放一个积木,也可以将拼接多个积木,要求每层的长度相同。最少…

使用expect工具 用ssh命令自动登录远程主机

#!/usr/expect/bin/expect # # 登录远程机器 # 参数&#xff1a; # ip: 远程主机IP # user: 远程主机用户 # password: 远程主机用户密码 ## check parameter numbers if {$argc < 3} {puts " Error : Parameter is error."puts " Usage : ./ssh.exp h…