hem*_*vsn 15 sql postgresql types postgresql-performance
根据Postgres文档,它们支持3种数据类型的字符数据:
Run Code Online (Sandbox Code Playgroud)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是什么?
Erw*_*ter 25
通常,在性能/内存方面没有使用的缺点text.相反:text是最佳的.其他类型或多或少有相关的缺点.@Quassnoi和@Guffa已经对此有所了解.
特别是,除非你知道自己在做什么,否则永远不要使用或char(别名为char(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中的字符数据.
Guf*_*ffa 10
从您链接到的页面:
“这三种类型之间没有性能差异,除了使用空白填充类型时增加了存储空间,以及在存储到长度受限列时需要一些额外的 CPU 周期来检查长度之外。而 character(n) 具有性能在其他一些数据库系统中具有优势,而在 PostgreSQL 中没有这样的优势;事实上,由于额外的存储成本,character(n) 通常是三者中最慢的。在大多数情况下,应该使用文本或字符变化。
在 Postgres 中使用该数据类型似乎没有任何缺点text。
但是,您应该考虑是否确实希望允许将大量文本存储在数据库中。将其保留为varchar较高的限制可以防止您无意中在数据库中存储大量数据。
您提到的所有数据类型都使用相同的内部表示(中等名称struct varlena)
该CHAR和VARCHAR数据类型只是添加长度检查此,并且(在的情况下CHAR),具有不同的空间填充的语义.
TEXT只要上述任何内容对您的逻辑都很重要,您就可以安全地使用.
| 归档时间: |
|
| 查看次数: |
6581 次 |
| 最近记录: |