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

     2023-02-24     198

关键词:

【中文标题】你怎么知道啥时候使用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 中的大多数问题都会出现,因为其他数据库对这两种数据类型的行为非常不同。

【讨论】:

枚举:为啥?啥时候?

...的实例非常少,除了代表标准纸牌面的典型案例之外。你知道在日常编码中使用枚举的任何巧妙方法吗?为什么枚举如此重要,在什么情况下应该能够确定构建枚举是最好的方法?【问题讨论】:"你知道枚举在日常编码中 查看详情

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

】我怎么知道啥时候已经在UIWebView中粘贴了一些东西?【英文标题】:HowdoIknowwhensomethinghasbeenpastedinaUIWebView?我怎么知道什么时候已经在UIWebView中粘贴了一些东西?【发布时间】:2013-08-1915:08:37【问题描述】:我有一个加载HTML字... 查看详情

我怎么知道啥时候应该使用无状态 Pod 或有状态 Pod?

】我怎么知道啥时候应该使用无状态Pod或有状态Pod?【英文标题】:howdoiknowwhenshouldiuseastatelesspodorastatefulone?我怎么知道什么时候应该使用无状态Pod或有状态Pod?【发布时间】:2021-09-1817:23:50【问题描述】:我是Kubernetes和Docker的... 查看详情

SQL 啥时候使用科学记数法?

...的数字都转化为科学形式,所以我正在寻找一种方法让我知道我的代码工作正常。我需要知道的是,什么时候使用科 查看详情

我啥时候应该使用 FutureBuilder?

...uilder?【发布时间】:2019-01-2916:02:44【问题描述】:我想知道什么时候应该使用futurebuilder。例如,如果我想发出一个http请求并在列表视图中显示结果,一旦你打开视图,我应该使用未来的构建器还是只构建一个ListViewBuilder之类... 查看详情

我啥时候应该在 PL/SQL 中使用过程或函数?

】我啥时候应该在PL/SQL中使用过程或函数?【英文标题】:whenshouldIgoforprocedureorfunctioninPL/SQL?我什么时候应该在PL/SQL中使用过程或函数?【发布时间】:2012-03-2403:32:57【问题描述】:我是PL/SQL新手,正在尝试一些练习示例。我对P... 查看详情

你啥时候在 RxJava 中使用 map 和 flatMap?

...字符串--使用map,我们必须以某种方式处理Exception。但是怎么做呢?:O 查看详情

Char和VarChar有啥区别[重复]

】Char和VarChar有啥区别[重复]【英文标题】:What\'sthedifferencebetweenCharAndVarChar[duplicate]Char和VarChar有什么区别[重复]【发布时间】:2015-12-1206:13:10【问题描述】:处理一个简单的数据库。我想知道什么时候应该使用这两种情况?我知... 查看详情

我啥时候应该在同一个视图控制器中使用多个视图?

...问题讨论】:【参考方案1】:这是一个笼统的问题,不知道你要做什么很难告诉你如何创建应用程 查看详情

我们啥时候在 C# 中使用嵌套类 [重复]

...类[重复]【发布时间】:2011-03-2309:09:53【问题描述】:想知道什么时候在C#中使用嵌套类是正确的吗?我们是否有过使用它不正当而因此不正确的事件?如果你能给出这两种情况的例子谢谢【问题讨论】:你有嵌套类的例子吗?... 查看详情

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

1,表关联的效率要高于子查询,因为子查询走的是笛卡尔积2,表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询追问比如说我有三张表ABC,其中AB连接要用一个字段,BC连接要用一个字段,就是A... 查看详情

你啥时候在 Java 中使用 volatile 关键字? [复制]

...读“Whentouse\'volatile\'inJava?”但我仍然感到困惑。我如何知道何时应该将变量标记为volatile?如 查看详情

在使用clickhouse-jdbc的时候,查询数据的时候偶尔会遇到这个错误,不知道是啥原因?

...ouse-jdbc的时候,查询数据的时候偶尔会遇到这个错误,不知道是啥原因?【英文标题】:Whenusingclickhouse-jdbc,Ioccasionallyencounterthiserrorwhenqueryingdata,andIwonderwhatthereasonis?在使用clickhouse-jdbc的时候,查询数据的时候偶尔会遇到这个错误... 查看详情

我应该啥时候使用 didFinishLaunchingWithOptions?

...发布时间】:2013-05-1403:13:56【问题描述】:我觉得我应该知道这一点,但我不知道,这总是让我感到困惑。在浏览示例代码和教程时,我有时会看到带有的AppDelegat 查看详情

我啥时候应该在 sql server 中使用表变量和临时表?

】我啥时候应该在sqlserver中使用表变量和临时表?【英文标题】:WhenshouldIuseatablevariablevstemporarytableinsqlserver?我什么时候应该在sqlserver中使用表变量和临时表?【发布时间】:2012-08-0503:58:52【问题描述】:我正在了解更多关于表... 查看详情

我啥时候应该在课堂上使用“this”?

...this”?【发布时间】:2011-01-2513:24:45【问题描述】:我知道this指的是当前对象。但我不知道什么时候我真的需要使用它。例如,如果我在某些方法中使用x而不是this.x,会有什么不同吗?可能是x将引用所考虑方法的本地变量?... 查看详情

你啥时候在流中使用接口而不是类型别名?

】你啥时候在流中使用接口而不是类型别名?【英文标题】:Whendoyouuseaninterfaceoveratypealiasinflow?你什么时候在流中使用接口而不是类型别名?【发布时间】:2016-08-2214:23:53【问题描述】:interface和type声明似乎做同样的事情。你什... 查看详情

oracle中事务怎么使用,啥时候使用事物

参考技术A事务是为了实现数据的一致性和并发处理,你对数据进行定义和修改时就会产生事务。例如你执行update语句,这时事务就开始了,执行commit会提交事务,而rollback会回滚(撤销)事务。如果你什么也不做,那么正常退出... 查看详情