根据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
有什么缺点?
答案 0 :(得分:21)
通常,在性能/内存方面使用text
存在没有缺点。相反:text
是最佳的。其他类型或多或少有相关的缺点。 @Quassnoi和@Guffa已经对此有所了解。
特别是从不使用 or char
(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
)
CHAR
和VARCHAR
数据类型只是对此添加长度检查,并且(在CHAR
的情况下)具有不同的空格填充语义。
如果上述任何内容对您的逻辑都不重要,您可以安全地使用TEXT
。
答案 2 :(得分:2)
从您关联的页面:
除了这三种类型之外没有性能差异 使用空白填充类型时增加的存储空间,和 存储到a时,检查长度的额外CPU周期很少 长度受限的列。虽然字符(n)具有性能 在其他一些数据库系统中的优势,没有这样的优势 在PostgreSQL中;事实上,字符(n)通常是最慢的 三,因为它额外的存储成本。在大多数情况下文字 或者应该使用变化的字符。“
在Postgres中使用text
数据类型似乎没有任何缺点。
但是,您应该考虑是否确实要允许将大量文本存储在数据库中。将其保留为varchar
但具有更高的限制将保护您免于无意中在数据库中存储大量数据。