你怎么知道啥时候使用varchar,啥时候在sql中使用text?

Posted

技术标签:

【中文标题】你怎么知道啥时候使用varchar,啥时候在sql中使用text?【英文标题】:How do you know when to use varchar and when to use text in sql?你怎么知道什么时候使用varchar,什么时候在sql中使用text? 【发布时间】:2011-06-09 23:33:57 【问题描述】:

这似乎是一个非常武断的决定。 在大多数情况下,两者都可以完成相同的事情。 在我看来,通过限制 varchar 长度,您就像是在踢自己的脚,因为您永远不知道需要多长的字段。

对于为您的字符串字段选择 VARCHAR 或 TEXT 是否有任何特定指南?

我将在 python 的 sqlalchemy orm 框架中使用 postgresql。

【问题讨论】:

与***.com/questions/564755/…重复 Quassnoi 之于 SQL,就如同 John Skeet 之于......好吧,其他一切,你无法超越他给出的答案。 我指的是在 cmets 中发布的副本,但那是在您提到 postgresql 之前。 【参考方案1】:

这句话错了:

在我看来,通过限制 varchar 长度就像是在自爆,因为你永远不知道需要多长的字段。

例如,如果您要保存 MD5 哈希,您确实知道该字段的存储量有多大,并且您的存储变得更加高效。其他例子有:

用户名(最多 64 个) 密码(最多 128 个) 邮政编码 地址 标签 还有更多!

【讨论】:

MD5 哈希值甚至可以更有效地存储在 CHAR(32) 列中。 没错,但我举了一个例子,限制长度不是在脚上射击自己。但再一次,真的。 谁说密码最多应该是 64 位? @Absolute0:1000 个字符的密码仍将被散列为 40 个字符的 SHA1 校验和。 @SolomonUcko 我国的邮政编码肯定不是整数。【参考方案2】:

在大多数情况下,您确实知道字段中字符串的最大长度是多少。例如,如果是姓氏的第一个,则不需要超过 255 个字符。因此,根据设计,您选择使用哪种类型,如果您总是使用文本,那么您就是在浪费资源

【讨论】:

这是一个不太准确的笼统陈述。每种选择都会浪费资源,因为可变长度的字段会使搜索变慢,从​​而导致 CPU 资源的浪费。【参考方案3】:

简而言之:

可变长度字段可以节省空间,但因为每个字段可以有不同的长度,所以会使表操作变慢 固定长度字段使表操作速度更快,但必须足够大以容纳最大预期输入,因此可以使用更多空间

可以类比数组和链表,其中数组是固定长度的字段,链表类似于 varchar。数组和链表哪个更好?幸运的是我们两者都有,因为它们在不同的情况下都很有用,在这里也是。

【讨论】:

大多数时候我们使用向量的一些变体:) 但我明白你的意思。 @Absolute0,你认为vector通常是如何在内部实现的?数组。这是完全相同的原理,如果你想随机访问任何元素,你需要知道每个元素的大小(固定大小),否则,你可以节省空间,虽然访问需要你移动元素元素,就像在链接中一样列表。 这个建议在 PostgreSQL 中不正确,char/varchar/text 类型在磁盘上具有完全相同的表示。使用 char 无法提高效率。 @intgr,好点,我想知道为什么会这样。有一天将不得不挖掘一些postgresql代码......【参考方案4】:

在 PostgreSQL 中,varchartext 之间没有技术区别

您可以将varchar(nnn) 视为具有禁止存储较大值的检查约束的text 列。

所以每次你想有一个长度限制时,使用varchar(nnn)

如果您不想限制数据的长度,请使用text

【讨论】:

你也可以在没有限制的情况下使用VARCHAR。 VARCHAR 和 VARCHAR(n) 是两个不同的东西。 啊,对。我总是忘记 varchar 也可以在没有长度限制的情况下使用。我通常使用 TEXT。【参考方案5】:

数据库设计者几乎总是知道一列需要容纳多少个字符。美国收货地址最多可包含 64 个字符。 (美国邮政局发布的地址指南是这样说的。)美国邮政编码有 5 个字符长。

数据库设计人员在指定列时会查看来自客户的代表性样本数据。她会问自己,诸如“最长的产品名称是什么?”之类的问题。而当答案是“70 个字符”时,她不会使列宽 3000 个字符。

VARCHAR 在 SQL Server 中的限制为 8k(我认为)。大多数应用程序几乎不需要为单个列提供那么多存储空间。

【讨论】:

您不应该将美国邮政编码限制为五个字符,他们在大约 30 年前将它们扩展到 ZIP+4(十个字符)。 冒着明显的风险,邮政编码仍然是五个字符。 ZIP+4 代码是五个字符加上另外四个字符。两列简化了约束,并简化了按邮政编码对地址进行分组。批量邮件的价格中断需要按邮政编码分组。 仅当您希望加拿大地址符合 USPS 规范时。专业人士更了解。 (Canada?最好少于 30 个字符,但对于可处理邮件,每个地址行不超过 40 个字符。)【参考方案6】:

在 PostgresOnline 上查看this article,它还链接到另外两篇有用的文章。

当您使用的工具、应用程序和驱动程序处理 TEXT 与 VARCHAR 非常不同时,PostgreSQL 中的大多数问题都会出现,因为其他数据库对这两种数据类型的行为非常不同。

【讨论】:

以上是关于你怎么知道啥时候使用varchar,啥时候在sql中使用text?的主要内容,如果未能解决你的问题,请参考以下文章

PowerDesigner 12.5 建数据库,我没有找到varchar类型 用啥类型替换把sql数据库varchar类型

Char和VarChar有啥区别[重复]

mysql啥时候使用子查询,啥时候使用表连接查询,关系多张表的时候该怎么查询

SQL查询语句中,为啥在WHERE后面查询条件有的要加单引号,有的不用加,啥时候加,啥时候不加?

mysql 啥时候分区 啥时候分表

我怎么知道啥时候已经在 UIWebView 中粘贴了一些东西?