PostgreSQL字符类型:CHAR,VARCHAR和TEXT
·
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(对于比较复杂的表,将花费相当多的时间)
更多推荐
所有评论(0)