你怎么知道啥时候使用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 中,varchar
和 text
之间没有技术区别
您可以将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类型
mysql啥时候使用子查询,啥时候使用表连接查询,关系多张表的时候该怎么查询