PostgreSQL字符类型:CHAR,VARCHAR和TEXT


最近在复习Python的基础知识并学习新的框架,学习过程中碰到一些小疑问,啃了一下英文文献并在此记录下来以便后续遗忘后温故知新。
本文只要描述PostgreSQL最常见的字符型型文本的三种类型对比CHAR,VARCHAR和TEXT,对比之间的关系并理解内部关系,方便日后更好地对数据类型进行选择。

PostgreSQL字符类型简介

Postgresql提供了三种字符类型:char(n),varchar(n)和text,其中n是正整数。

类型描述
char(n)定长,空白填充
varchar(n)可变长度限制
text,varchar可变无限长度

char(n)和varchar(n)可以存储最多n个字符的长度,如果存入超过n长度的字符,Postgresql将会发出错误。如果存入的多余字符是空格,Postgresql会截取空格后的字符串存储。如果字符串明确强制转换为char(n)和varchar(n),postgresql将会存储字符串的前n个字符。
text类型可以存储不限长度的字符串。
varchar如果没有指定n整数,则行为类似于text类型,varchar(没有n)的性能和text是相同的。指定n的唯一优点就是当存入超过n长度的字符串时,postgresql会对其进行检查并发出警告。
char没有指定n整数时,等同于char(1)。
跟其他数据库不一样是,在PostgreSQL中,三种字符类型之间没有性能差异。在大多数情况下,您应该使用text或varchar,varchar(n)如果您希望PostgreSQL检查长度限制。

总结

  • varchar(没有n) = text
  • char(没有n) = char(1)
  • varchar(n)唯一好处是:当字符串超过n时会执行失败
  • PostgreSQL中三种字符类型没有性能差异,推荐用text或varchar,要求限制长度则用varchar(n)

性能测试结果

没有详细的数据测试实例好像不太严谨,在此引用外国达人的测试结果
https://www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/

  • char(n) – takes too much space when dealing with values shorter than n, and can lead to subtle errors because of adding trailing spaces, plus it is problematic to change the limit(处理短于n的值时占用太多空间,并且由于添加尾随空格可能导致细微错误,另外更改限制也有问题)
  • varchar(n) – it’s problematic to change the limit in live environment(在生产环境改变最小值时会存在问题)
  • varchar – just like text(跟text一样)
  • text – for me a winner – over (n) data types because it lacks their problems, and over varchar – because it has distinct name(胜利者是我,对比(n)数据类型因为没有他们的问题,对比varchar因为有不同的名字)

对于varchar(n)的n值改大的问题体现为:

  • Requires exclusive lock on the table for the time of operation(在操作时需要对表进行独占锁定)
  • In case of non-trivial tables, will take considerable amount of time(对于比较复杂的表,将花费相当多的时间)
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐