30

根据PostgreSQL 文档,它们支持 3 种字符数据的数据类型:

character varying(n), varchar(n)  variable-length with limit
character(n), char(n)             fixed-length, blank padded
text                              variable unlimited length

在我的应用程序中,我遇到了一些令人不快的场景,其中插入/更新查询失败,因为要插入的所需文本超出了varchar(n)orchar(n)限制。

对于这种情况,改变这些列的数据类型就text足够了。

我的问题是:

  • 如果我们将每个字符存储列的数据类型概括并更改为text,那么在性能/内存方面是否有任何不利之处?
  • 如果具有数据类型的列text每次存储 10 个或更少的字符,我应该选择textorvarchar(10)吗?
  • 如果我去有text什么缺点?
4

3 回答 3

52

一般来说,在性能/内存方面使用没有缺点。text反之:text是最优的。其他类型或多或少有相关的缺点。text从字面上看,它是 Postgres 类型系统中字符串类型中的“首选”类型,它会影响函数或运算符类型的解析。

特别是,除非您知道自己在做什么,否则永远不要使用char(n)(alias for )。或者只是 的缩写,所以都一样。内部名称是(代表“空白填充字符”)。该类型仅用于与旧代码和标准兼容。现在它已经没有什么意义了,浪费内存并且可能会造成麻烦:character(n)charcharactercharacter(1)bpchar

您可以使用varchar(n)with 长度修饰符(别名为character varying(n))。但varchar(255)通常表示从其他 RDBMS 继承的误解,它可能是性能的局部最优值。在 Postgres 中,长度修饰符(255)没有特殊含义,而且很少有意义。

旧版本在尝试更改varchar(n)以后的长度修饰符时会引起各种问题。大多数这些问题在现代 Postgres 中得到了缓解,但是没有长度说明符的textor varchar(别名为)(而是一个约束)从来没有遇到任何这些问题。character varyingCHECK

CHECK约束同样快,并且不太可能导致依赖于列类型的依赖视图、函数、FK 约束等问题。它可以做的不仅仅是强制最大字符长度——任何你可以放入布尔表达式的东西。看:

最后,还有"char"(带有双引号):用于单个 ASCII 字母的 1 字节数据类型,用作廉价的内部枚举类型。

除了 Postgres 中的字符数据,我很少使用其他任何东西text

于 2013-12-02T17:26:52.640 回答
6

您提到的所有数据类型都使用相同的内部表示(比较有名struct varlena

和数据类型只是为此添加了长度检查,并且(在 的情况下CHAR)具有不同的空格填充语义。VARCHARCHAR

您可以TEXT安全地使用上述任何内容对您的逻辑都不重要的地方。

于 2013-12-02T11:21:30.813 回答
4

从您链接到的页面:

“这三种类型之间没有性能差异,除了使用空白填充类型时增加了存储空间,以及在存储到长度受限的列时需要额外的几个 CPU 周期来检查长度。而 character(n) 具有性能"

text在 Postgres中使用数据类型似乎没有任何缺点。

但是,您应该考虑是否真的要允许将大量文本存储在数据库中。将其保留为varchar但具有更高的限制可以防止您无意中在数据库中存储大量数据。

于 2013-12-02T11:24:02.137 回答