文本数据类型和字符变化(varchar)数据类型之间的区别是什么?
根据文档
如果使用不带长度说明符的字符变化,则该类型接受任何大小的字符串。后者是PostgreSQL的扩展。
and
此外,PostgreSQL还提供了文本类型,用于存储任意长度的字符串。尽管类型text不在SQL标准中,但其他几个SQL数据库管理系统也具有它。
那么有什么不同呢?
文本数据类型和字符变化(varchar)数据类型之间的区别是什么?
根据文档
如果使用不带长度说明符的字符变化,则该类型接受任何大小的字符串。后者是PostgreSQL的扩展。
and
此外,PostgreSQL还提供了文本类型,用于存储任意长度的字符串。尽管类型text不在SQL标准中,但其他几个SQL数据库管理系统也具有它。
那么有什么不同呢?
当前回答
区别在于传统和现代。
传统上,您需要指定每个表列的宽度。如果您指定的宽度太大,则会浪费昂贵的存储空间,但如果您指定的宽度太小,则一些数据将无法存储。然后你将调整列的大小,并不得不改变许多连接的软件,修复引入的错误,这都是非常麻烦的。
现代系统允许使用动态存储分配的无限字符串存储,因此附带的大字符串可以很好地存储,而不会浪费存储小数据项。
虽然许多编程语言都采用了无限大小的“字符串”数据类型,如c#、javascript、java等,但像Oracle这样的数据库却没有。
现在PostgreSQL支持“text”,很多程序员仍然习惯VARCHAR(N),并推理:是的,文本和VARCHAR是一样的,除了VARCHAR你可以添加一个限制N,所以VARCHAR更灵活。
你可能会想,既然我们可以用TEXT简化我们的生活,为什么我们要使用没有N的VARCHAR呢?
在我使用Oracle的最近几年里,我很少使用CHAR(N)或VARCHAR(N)。因为Oracle没有无限的字符串类型,所以我对大多数字符串列使用VARCHAR(2000),其中2000在某些时候是VARCHAR的最大值,在所有实际用途中与'infinite'没有太大区别。
现在我正在使用PostgreSQL,我认为TEXT是真正的进步。不再强调CHAR类型的VAR特性。不再强调让我们使用没有n的VARCHAR。此外,输入TEXT比VARCHAR节省了3个按键。
现在,年轻的同事在成长过程中甚至不知道过去没有无限的限制。就像在大多数项目中一样,他们不需要了解汇编编程。
其他回答
我浪费了太多的时间,因为使用varchar而不是文本的PostgreSQL数组。
数组操作符不能处理字符串列。详情请参阅以下链接:(https://github.com/rails/rails/issues/13127)和(http://adamsanderson.github.io/railsconf_2013/?full#10)。
正如文档中的“字符类型”所指出的,varchar(n)、char(n)和text都是以相同的方式存储的。唯一的区别是需要额外的循环来检查长度,如果给定了一个,如果需要填充char(n),则需要额外的空间和时间。
然而,当您只需要存储单个字符时,使用特殊类型“char”会有轻微的性能优势(保留双引号-它们是类型名称的一部分)。您可以更快地访问字段,并且没有存储长度的开销。
我刚刚创建了一个包含1,000,000个从小写字母中随机选择的“字符”的表。查询频率分布(select count(*), field…按字段分组)大约需要650毫秒,而使用文本字段的相同数据大约需要760毫秒。
Text和varchar有不同的隐式类型转换。我注意到的最大影响是对尾随空格的处理。例如……
select ' '::char = ' '::varchar, ' '::char = ' '::text, ' '::varchar = ' '::text
返回真,假,真和不真,真,真,如你所料。
区别在于传统和现代。
传统上,您需要指定每个表列的宽度。如果您指定的宽度太大,则会浪费昂贵的存储空间,但如果您指定的宽度太小,则一些数据将无法存储。然后你将调整列的大小,并不得不改变许多连接的软件,修复引入的错误,这都是非常麻烦的。
现代系统允许使用动态存储分配的无限字符串存储,因此附带的大字符串可以很好地存储,而不会浪费存储小数据项。
虽然许多编程语言都采用了无限大小的“字符串”数据类型,如c#、javascript、java等,但像Oracle这样的数据库却没有。
现在PostgreSQL支持“text”,很多程序员仍然习惯VARCHAR(N),并推理:是的,文本和VARCHAR是一样的,除了VARCHAR你可以添加一个限制N,所以VARCHAR更灵活。
你可能会想,既然我们可以用TEXT简化我们的生活,为什么我们要使用没有N的VARCHAR呢?
在我使用Oracle的最近几年里,我很少使用CHAR(N)或VARCHAR(N)。因为Oracle没有无限的字符串类型,所以我对大多数字符串列使用VARCHAR(2000),其中2000在某些时候是VARCHAR的最大值,在所有实际用途中与'infinite'没有太大区别。
现在我正在使用PostgreSQL,我认为TEXT是真正的进步。不再强调CHAR类型的VAR特性。不再强调让我们使用没有n的VARCHAR。此外,输入TEXT比VARCHAR节省了3个按键。
现在,年轻的同事在成长过程中甚至不知道过去没有无限的限制。就像在大多数项目中一样,他们不需要了解汇编编程。
character varying(n), varchar(n) -(两者相同)。值将被截断为n个字符而不引发错误。 character(n), char(n) -(都是一样的)。固定长度,并将空白垫至长度结束。 文本-无限长度。
例子:
Table test:
a character(7)
b varchar(7)
insert "ok " to a
insert "ok " to b
我们得到了结果:
a | (a)char_length | b | (b)char_length
----------+----------------+-------+----------------
"ok "| 7 | "ok" | 2