有什么理由在数据库中的文本列上使用varchar吗?


36

是否varchar只是一个残存从之前text到来的时候,还是有使用情况下,您会希望使用varchar?(或者char就此而言。)

(我每天都使用Postgres和MySQL(MyISAM),所以这些是我最感兴趣的,但是当然也欢迎提供其他数据库的答案。^ _-)


6
至少对于SQL Server而言text已弃用。还需要考虑与数据存储位置以及如何访问数据有关的用法。
奥德

在某些DBMS上,您可能无法在sort或where子句中使用文本列。我对Postgres不熟悉,但是请检查您的文档。
jqa 2012年

1
这个StackOverflow问题可能会提供更多信息。
J0ANMM

Answers:


32

一般来说

text列是非标准且特定于实现的列。在许多情况下,取决于数据库,它们可能具有以下一项或多项限制的组合:不可索引不可搜索不可排序

在Postgres

所有这些类型都使用相同的C数据结构在内部保存。

在MySQL中

text是的专用版本,BLOB并且对索引有限制。

仅这两个示例可以推断到其他SQL RDBMS系统,并且应该有足够的理由来理解何时选择一种类型而不是另一种类型。

只是为了使它含蓄清楚,您永远不要使用TEXT它,因为它是专有的和非标准的。SQL您针对它写的任何内容都将无法移植,并保证将来会给您带来问题。仅使用属于ANSI标准的类型

  • 使用CHAR时,你知道你有字符固定数量的每一个条目。
  • VARCHAR当每个条目的字符数可变时使用。
  • 如果您需要的存储量超出了VARCHAR可提供的范围,请CLOB使用UTF-8编码或等效标准类型。
  • 切勿使用,TEXT因为它是非标准的。

1
接受non standard and implementation specificnot indexable, not searchable and not sortable,但我没有意识到。我当时的印象text 标准化的。
Izkata 2012年

1
您是指ASCII text标准还是UNICODE text标准:-)还是其他六种text编码标准之一?

1
如果您深入研究SQL标准文档,我认为您不会找到任何有关text字符类型的信息。我什么都没看到,有些供应商称其long char为类似产品,它基本上是一个附带有编码的BLOB。

2
@JarrodRoberson说实话,有很多著名的资源(在Postgres环境中)确实会“总是使用TEXT”。如果要迁移到其他数据库,这几乎不会破坏交易,尤其是因为您必须考虑到postgres的无限制VARCHAR(由于TOAST的原因,没有行限制,例如MySQL)可能不会转换为VARCHARin反正其他数据库。
Kayaman

1
...并且由于Postgres不支持CLOB,倒数第二点不成立。即使遵守该标准,您也永远无法支持直接替换。除非您正在编写玩具SQL,否则在现实世界中编写ANSI SQL并不是可行的选择。
Kayaman

11

textvarchar并且char都使用不同的原因。当然存在实现上的差异(它们占用了多少大小等),但也有用法和意图方面的考虑。什么类型的使用也告诉你一些有关的那种将被存储在它的数据(或我们都会使用text一切)。如果某件东西的长度固定,则使用char。如果长度可变且上限明确,则使用varchar。如果这是一大段文本,您几乎无法控制,那text可能就是您的最佳选择。


3
Sooooooo,唯一真正的区别是重复限制检查,该限制检查无论如何应该在程序代码中进行?
伊兹卡塔2012年

2
@Izkata-实现上也有差异。它与边界检查无关,而与数据类型有关。(美国)邮政编码始终是5位数字,因此使用“ char”之类的内容成为该数据定义的一部分。如果仅仅是边界检查之类的东西,我们都可以对所有数据使用一种数据类型,然后进行检查和强制转换代码。
系统停机

6
@SystemDown据我所知,charvarchar,和text都被设计用于存储相同类型的数据。因此,这两个答案都是关于边界检查的。如果存在效率差异,那是什么? 我为什么要varchar用完text
Izkata 2012年

1
浮点型和双精度型也用于相同类型的数据,但是它们具有差异并且使用不同。至于实现方面的差异,我对Postgres不够了解,无法回答我担心的问题。
系统停机

4
@SystemDown尽管将邮政编码存储为char(5)可能会在您开始国际化时给您带来麻烦。英国邮政编码的长度各不相同,而5个字符几乎是远远不够的。但是,我不知道英国邮政编码中的空格是否与解析相关。
Vatine 2012年

5

数据库非常关注性能-速度最小化存储。在计算机世界的大多数其他地方,您不会对字符串中有多少个字符感到困扰。它可以是一本百科全书,也可以是一本百科全书的全部内容;全部都是一个字符串。实际上,很多语言甚至都不会打扰您是字符串还是数字。

但是随着计算机变得越来越快并获得更多的内存,人们将更多的数据放入他们的数据库中并进行更奇特的查询。对于数据库来说,今天的CPU和内存就像在64Kb主内存和10Mb硬盘驱动器(在大型机上)的时代一样受到限制。

固定字节数比可变长度数要容易得多。10字节要比1,000,000容易得多。因此,您的数据库希望您提供一个线索,以便可以在几微秒内从TB的数据中获得千兆字节的结果。如果您不那么努力地使用数据库,则不需要它提供的速度,并且会因为不必要的问题而烦恼。但是,如果确实需要性能,您将很乐意给它一些提示。

如其他答案中所述charvarchar如果长度始终使用一定数量的字符,长度可以变化但不会太大(如果我大多数DB会将其视为chartext取决于大小),请使用,text如果使用可以是任何长度。如果您的SQL尝试使用text列,则最好以某种方式对其进行汇总,然后将其也放置在一个char较小的varchar列中,然后在该列上执行whereorder by。当然,只有性能对您很重要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.