为什么要为字符变化类型指定长度

2024-05-22

参考 Postgres 文档字符类型 http://www.postgresql.org/docs/current/static/datatype-character.html,我不清楚指定字符变化(varchar)类型的长度。

假设:

  • 字符串的长度对应用程序来说并不重要。
  • 你不在乎有人将最大大小放入数据库中
  • 你有无限的硬盘空间

它确实提到:

短字符串(最多126字节)的存储要求是1字节 加上实际的字符串,其中包括大小写中的空格填充 的性格。较长的字符串有 4 个字节的开销,而不是 1 个。 长字符串会被系统自动压缩,所以 对磁盘的物理要求可能会更少。很长的值也是 存储在后台表中,以便它们不会干扰快速 访问较短的列值。无论如何,尽可能长的 可存储的字符串约为1GB。 (最大值 数据类型声明中允许 n 小于 那。改变这个是没有用的,因为对于多字节 字符编码的字符数和字节数可以相当 不同的。

这里讨论的是字符串的大小,而不是字段的大小(即听起来它总是会压缩大 varchar 字段中的大字符串,但不会压缩大 varchar 字段中的小字符串?)

我问这个问题是因为指定一个更大的尺寸会更容易(而且更懒),所以你永远不必担心字符串太大。例如,如果我为地名指定 varchar(50),我将获得具有更多字符的位置(例如 Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch),但如果我指定 varchar(100) 或 varchar(500),我不太可能遇到该问题。

那么,如果最大的字符串长度为 400 个字符,那么 varchar(500) 和(任意)varchar(5000000) 或 text() 之间的性能会受到影响吗?

同样出于兴趣,如果有人知道这个问题的答案并且知道其他数据库的答案,也请添加。

我用谷歌搜索过,但没有找到足够的技术解释。


我的理解是,有约束对数据很有用正直,因此我使用列大小来验证较低层的数据项,并更好地描述数据模型。

关于此事的一些链接:

  • VARCHAR(n) 被认为是有害的 http://people.planetpostgresql.org/dfetter/index.php?/archives/24-VARCHARn-Considered-Harmful.html
  • CHAR(x) 与 VARCHAR(x) 与 VARCHAR 与 TEXT http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/
  • 捍卫 varchar(x) http://www.postgresonline.com/journal/archives/154-In-Defense-of-varcharx.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要为字符变化类型指定长度 的相关文章

随机推荐

  • ' aria-label='keras 模型拟合:ValueError:无法找到可以处理输入的数据适配器:'> keras 模型拟合:ValueError:无法找到可以处理输入的数据适配器:

    我正在构建一个简单的 CNN 模型用于多类分类 训练和测试数据位于data path根据所需的类子目录flow from directory的函数ImageDataGenerator 这是我根据数据构建和训练模型的代码 from tenso
  • 使用 Symfony 3 / Doctrine 进行属性形式的一对多对一

    问题是这样的 我有一个包含 3 个类的模型 person 人员 工作 job 一个人可以有多个工作 任何工作与人的关系都可以有 date start 属性 date end 和 comment 因此 我使用持有这些属性的可连接 person
  • System.Net.HttpListenerException:无法侦听前缀“http://localhost:8080”

    我正在运行以下代码Scott Allen 的 ASP Net 基础课程 http www pluralsight com courses aspdotnet mvc5 fundamentals using System using Micr
  • 在 IE 中使用
    标签时,填充不起作用

    我在我的应用程序中使用 HTML5 标签 标签的填充在 chrome ff 和 safari 中工作正常 但在 IE 中不起作用 我尝试添加显示 块 与部分样式 但它没有用 有什么解决办法吗 许多旧浏览器不理解 HTML5 标签 例如sec
  • 创建新的合并请求时,GitLab 不运行 CI/CD 管道

    当我执行以下操作时 我的 GitLab CI CD 就会运行 click Create merge request 创建分支中的每个提交 当合并请求分支合并到master时 我想跳过第一个管道 在创建合并请求时 因为我想优化 紧固 我的 C
  • 结构等效和名称等效

    我似乎无法准确理解名称等效是什么 我很确定我的结构性下降了 我的教授举的一个例子是这样的 Type TI integer Type TTI TI a integer b TTI f ref float g ref float a 和 b 都
  • Dataframe unstack 性能 - pandas

    我正在尝试拆开数据框 它工作正常 但问题是我正在处理 CSV 文件中的巨大数据集 约 10 亿 这是示例数据集 236539 48512569874 Name Danny 236539 48512569874 Class 12 236539
  • LINQ to XML - 如何正确使用 XDocument

    现在我首先要说的是 这确实是一项任务 然而 在我遇到 Linq to XML 语法之前 我几乎已经完成了它 我有 2 个课程 曲目和 CD 现在作为作业的一部分 我创建了一张 CD 然后向其中添加了一些曲目 在搜索了大量完美解释了如何从 x
  • 由于iOS6中恢复了谷歌地图,MKMapView会在iOS6中自动使用谷歌地图吗?

    由于苹果已经在iOS6中恢复了谷歌地图 如果我使用MKMapView在我的 iPhone 应用程序中 它会自动使用谷歌地图吗 如果您想在应用程序中使用 Google 地图 则应使用适用于 iOS 的 Google 地图 SDK https
  • 节省页面加载时间的提示[重复]

    这个问题在这里已经有答案了 我的问题 削减那些不必要的 kb 并使页面加载速度更快的最佳方法是什么 全部是什么优化实践 编码实践 在js php中 如果执行可以使您的页面更轻 为什么我问这个 我读了这篇关于 jquery js 与 jque
  • 将 2D 数组映射到 1D 数组

    我想用一维数组来表示一个二维数组 函数将传递两个索引 x y 和要存储的值 这两个索引代表一维数组的单个元素 并相应地设置它 我知道一维数组需要具有 arrayWidth arrayHeight 的大小 但我不知道如何设置每个元素 例如 如
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • 无法将中间件与 Firebase 和 NuxtJS 3 一起使用

    我正在尝试在示例项目中使用 Firebase 身份验证 身份验证按预期工作 但是一旦我想使用中间件来阻止用户访问管理页面或在已经登录的情况下访问登录页面 这是不可能的 我已经尝试了几个小时 但没有任何效果 这是我的package json
  • UITableView行高不变

    我创建了一个自定义单元格 我有一系列字典 对于我需要创建的字典值UILables 每个单元可能包含不同数量的UILabels 所以按照我的习惯UITableViewCell类我就是这样做的 void generateCell BOOL is
  • 如何在 C# 事件中区分更改是由代码还是由用户进行?

    我有一个简单的TextBox一开始是空的 我有一个简单的事件 TextChanged 可以知道用户何时更改了其中的任何内容TextBox 但是 如果我自己在代码中对其执行任何操作 该事件就会触发 喜欢设置textbox Text Test
  • 处理 LINQ sum 表达式中的 null

    我正在使用 LINQ 查询来查找列的总和 并且在少数情况下该值有可能为空 我现在使用的查询是 int score dbContext domainmaps Where p gt p SchoolId schoolid Sum v gt v
  • Groupby Sum 忽略几列

    在此数据框中 我想按 位置 进行分组并获得 分数 的总和 但我不希望 纬度 经度 和 年份 在此过程中受到影响 sample pd DataFrame Location A B C A B C Year 2001 2002 2003 200
  • 是否可以访问可执行 JAR 之外的 SQLite 数据库文件?

    我有一个作为可执行 JAR 文件部署的应用程序 最初 这个 JAR 文件将与 MySQL 数据库通信 但最近我决定改用 SQLite 然而 在测试时我发现从 JAR 文件运行应用程序时无法访问 SQLite 数据库文件 我使用来自以下网站的
  • 错误代码:1062。重复条目“PRIMARY”

    因此 我的教授给了我表格将其插入数据库 但是当我执行他的代码时 MySQL 不断给出错误代码 1062 这是冲突表和插入 TABLES CREATE TABLE FABRICANTES COD FABRICANTE integer NOT
  • 为什么要为字符变化类型指定长度

    参考 Postgres 文档字符类型 http www postgresql org docs current static datatype character html 我不清楚指定字符变化 varchar 类型的长度 假设 字符串的长