PostgreSQL:文本和varchar之间的区别(字符变化)
text
数据types和character varying
( varchar
)数据types有什么区别?
根据文件
如果使用不带长度说明符的字符variables,则该types接受任何大小的string。 后者是PostgreSQL扩展。
和
另外,PostgreSQL提供了文本types,它存储任意长度的string。 虽然types文本不在SQL标准中,但是其他几个SQL数据库pipe理系统也是如此。
那有什么区别?
它们之间没有什么区别,它们都是varlena( 可变长度数组 )。
检查这篇文章从Depesz: http : //www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
几个亮点:
总结一下:
- char(n) – 在处理小于n的值时占用太多的空间,并且由于添加了尾随空格,可能会导致细微的错误,另外,更改限制
- varchar(n) – 改变实时环境的限制是有问题的
- varchar – 就像文本一样
- 文本 – 对我来说是胜利者 – over(n)数据types,因为它缺less他们的问题,并通过varchar – 因为它具有不同的名称
本文做了详细的testing,表明所有4种数据types的插入和select的性能是相似的。 在需要的时候,还要详细研究限制长度的方法。 基于函数的约束或域提供了即时增加长度约束的优点,并且在减lessstring长度约束的基础上很less见的情况下,depesz得出结论,其中一个通常是长度限制的最佳select。
正如文档中的“ 字符types ”指出的那样, varchar(n)
, char(n)
和text
都以相同的方式存储。 唯一的区别是需要额外的循环来检查长度,如果给定的话,以及char(n)
需要填充所需的额外空间和时间。
但是,只需要存储单个字符时,使用特殊types"char"
(保留双引号 – 它们是types名称的一部分)会有一些性能优势。 您可以更快地访问该字段,并且无需存储长度的开销。
我刚刚制作了一个由小写字母组成的100万个随机"char"
表。 查询得到一个频率分布( select count(*), field ... group by field
)大约需要650毫秒,而使用text
字段的数据大约是760。
2016年更新基准(第9页+)
并使用“纯SQL”基准(没有任何外部脚本)
-
使用UTF8的任何string_generator
-
主要基准:
2.1。 插
2.2。 select比较和计数
CREATE FUNCTION string_generator(int DEFAULT 20,int DEFAULT 10) RETURNS text AS $f$ SELECT array_to_string( array_agg( substring(md5(random()::text),1,$1)||chr( 9824 + (random()*10)::int ) ), ' ' ) as s FROM generate_series(1, $2) i(x); $f$ LANGUAGE SQL IMMUTABLE;
准备特定的testing(例子)
DROP TABLE IF EXISTS test; -- CREATE TABLE test ( f varchar(500)); -- CREATE TABLE test ( f text); CREATE TABLE test ( f text CHECK(char_length(f)<=500) );
进行基本testing:
INSERT INTO test SELECT string_generator(20+(random()*(i%11))::int) FROM generate_series(1, 99000) t(i);
而其他的testing,
CREATE INDEX q on test (f); SELECT count(*) FROM ( SELECT substring(f,1,1) || f FROM test WHERE f<'a0' ORDER BY 1 LIMIT 80000 ) t;
…并使用EXPLAIN ANALYZE
。 我的结果:平均而言,都是一样的。
在PostgreSQL手册上
这三种types之间没有性能差异,除了使用空白填充types时增加的存储空间以及在存储到长度受限的列时检查长度的一些额外的CPU周期。 虽然character(n)在其他一些数据库系统中具有性能优势,但在PostgreSQL中没有这样的优势; 事实上,字符(n)通常是三者中最慢的,因为其额外的存储成本。 在大多数情况下,应该使用文本或字符变化。
我通常使用文本
参考文献: http : //www.postgresql.org/docs/current/static/datatype-character.html
有点OT:如果您使用的是Rails,则网页的标准格式可能会有所不同。 对于数据input表单text
框是可滚动的,但character varying
(Rails string
)框是单行的。 显示视图只要需要。