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

hem*_*vsn 15 sql postgresql types postgresql-performance

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

character varying(n), varchar(n)  variable-length with limit
character(n), char(n)             fixed-length, blank padded
text                              variable unlimited length
Run Code Online (Sandbox Code Playgroud)

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

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

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

Erw*_*ter 25

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

特别是,除非你知道自己在做什么,否则永远不要使用charchar(n)(别名为character/ character(n)).这种空白填充类型仅用于兼容旧代码和标准.它现在没什么意义,浪费记忆,可能会造成麻烦:

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

ALTER TABLE tbl ADD CONSTRAINT tbl_col_len CHECK (length(col) < 100);
Run Code Online (Sandbox Code Playgroud)

一个CHECK约束还可以做更多的不仅仅是强制执行最大字符长度-任何你能放入一个布尔表达式.阅读更多:

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

我很少使用textPostgres中的字符数据.

  • 从PG 9.2开始,可以在不重写表的情况下增加/删除`varchar(n)`约束.如果你不想直接添加SQL约束,那么像Django这样的ORM通过将它们映射到`varchar(n)`来处理长度约束字段会更容易.除了9.2中提到的上述问题之外,还有其他理由更喜欢`text`而不是`varchar(n)`吗?http://www.postgresql.org/docs/9.2/static/release-9-2.html (2认同)
  • @buffer:好点,重要的更新.Postgres 9.2带来了重大改进,在更改长度说明符时不再需要表重写.但是带有`CHECK`约束的`text`仍然更通用,更多的是引入[`NOT VALID`约束](http://dba.stackexchange.com/questions/75613/disable-all-constraints-and- 9.1中的table-checks-while-restoring-a-dump/75635#75635)和9.2中的更新.这是一篇相关博客,内容很好:http://blog.endpoint.com/2012/11/postgres-alter-column-problems-and.html (2认同)

Guf*_*ffa 10

从您链接到的页面:

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

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

但是,您应该考虑是否确实希望允许将大量文本存储在数据库中。将其保留为varchar较高的限制可以防止您无意中在数据库中存储大量数据。

  • 那么使用“CHECK”约束会吗? (2认同)
  • @Vérace 自 [v9.2](https://www.postgresql.org/docs/9.2/release-9-2.html#AEN114949:~:text=Increasing%20the%20length%20limit%20for%20a, no%20longer%20requires%20a%20table%20rewrite) 我更喜欢 `varchar(n)` 而不是 `text`,因为它允许我增加长度而无需重新检查。无论您是否增加字符长度,更改检查约束都会强制重新检查。该检查使用 AccessExclusiveLock,防止读取,使其不适合生产数据库。 (2认同)

Qua*_*noi 5

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

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

TEXT只要上述任何内容对您的逻辑都很重要,您就可以安全地使用.