使用数据类型“text”存储字符串的任何缺点?

时间:2013-12-02 11:12:37

标签: sql postgresql types postgresql-performance

根据Postgres documentation,它们支持3种数据类型的字符数据:

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

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

对于这种情况,将此类列的数据类型更改为text就足够了。

我的问题是:
如果我们将每个字符存储列的数据类型概括并更改为text,那么性能/内存是否有任何缺点?
如果数据类型为text的列每次都会存储10个或更少字符,那么我应该选择text还是varchar(10)? 如果我选择text有什么缺点?

3 个答案:

答案 0 :(得分:21)

通常,在性能/内存方面使用text存在没有缺点。相反:text是最佳的。其他类型或多或少有相关的缺点。 @Quassnoi和@Guffa已经对此有所了解。

特别是从不使用char or char(n) character / character(n) 的别名),除非你知道你在做什么。这种空白填充类型仅用于兼容旧代码和标准。它现在没什么意义,浪费记忆,可能会带来麻烦:

要在列上强制执行最大长度,仍然使用 text (或varchar没有长度说明符,这基本上是相同的)而不是varchar(n)character varying / character varying(n)的别名)。稍后更改CHECK constraint会更方便(没有表重写),当视图,函数,FK约束等依赖于列类型时更是如此。

ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 100);

CHECK约束不仅可以强制执行最大字符长度 - 您可以将任何内容放入布尔表达式中。阅读更多:

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

除了text之外,我很少使用Postgres中的字符数据。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

从您关联的页面:

  

除了这三种类型之外没有性能差异   使用空白填充类型时增加的存储空间,和   存储到a时,检查长度的额外CPU周期很少   长度受限的列。虽然字符(n)具有性能   在其他一些数据库系统中的优势,没有这样的优势   在PostgreSQL中;事实上,字符(n)通常是最慢的   三,因为它额外的存储成本。在大多数情况下文字   或者应该使用变化的字符。“

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

但是,您应该考虑是否确实要允许将大量文本存储在数据库中。将其保留为varchar但具有更高的限制将保护您免于无意中在数据库中存储大量数据。