varchar(20) 和 varchar(50) 相同吗?

2024-05-10

我看到评论“如果 varchar(20) 列中有 5000 万个 10 到 15 个字符之间的值,而 varchar(50) 列中有同样的 5000 万个值,它们将占用完全相同的空间。这就是重点varchar,而不是 char”。有人可以告诉我原因吗?看人员“姓名”字段的合理长度限制是多少? https://stackoverflow.com/questions/30485/what-is-a-reasonable-length-limit-on-person-name-fields#comment-3373890


MySQL 提供多种存储引擎选择。数据的物理存储取决于存储引擎。

VARCHAR 的 MyISAM 存储

在 MyISAM 中,VARCHARs 通常只占用字符串的实际长度加上一个或两个字节的长度。这是由于 MyISAM 对表锁定(而不是行锁定功能)的设计限制而变得实用的。性能后果包括更紧凑的缓存配置文件,但也包括更复杂(更慢)的记录偏移计算。

(事实上​​,MyISAM 给你一定程度的选择 http://dev.mysql.com/doc/refman/5.1/en/static-format.html固定物理行大小和可变物理行大小表格式之间的关系取决于整个表中出现的列类型。发生情况VARCHAR仅更改默认方法,但存在TEXT blob forces VARCHAR同一个表中的 s 也使用可变长度方法。)

物理存储方法对于索引尤为重要,这与表不同。 MyISAM 使用空间压缩both CHAR and VARCHAR列,这意味着在这两种情况下,较短的数据在索引中占用的空间较小。

VARCHAR 的 InnoDB 存储

InnoDB 与当前大多数其他关系数据库一样,使用更复杂的机制。VARCHAR最大宽度小于 768 字节的列将内联存储,并保留与最大宽度匹配的空间。更精确地here http://dev.mysql.com/doc/refman/5.1/en/innodb-physical-record.html:

对于每个非 NULL 可变长度字段,记录头包含 列的长度(以一或两个字节为单位)。两个字节只会 如果列的一部分存储在溢出页中或外部,则需要 最大长度超过255字节,实际长度超过127字节 字节。对于外部存储列,两字节长度表示 内部存储部分的长度加上指向的 20 字节指针 外部存储的部分。内部部分是768字节,所以 长度为768+20。 20字节的指针存储了真实的长度 柱子。

InnoDB 目前在其索引中不进行空间压缩,这与上面描述的 MyISAM 相反。

回到问题

然而,以上所有内容只是一个实现细节,甚至可能在版本之间发生变化。之间的真正区别CHAR and VARCHAR是语义的,之间的也是语义的VARCHAR(20) and VARCHAR(50)。通过确保无法在 a 中存储 30 个字符的字符串VARCHAR(20)数据库使各种处理器和应用程序的生活变得更加轻松和更好地定义,据称它已集成到可预测行为的解决方案中。这是一件大事。

具体到个人姓名,这个问题 https://stackoverflow.com/questions/30485/what-is-a-reasonable-length-limit-on-person-name-fields可能会给你一些实用的指导。无论如何,全名超过 70 个 UTF-8 字符的人都会遇到麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

varchar(20) 和 varchar(50) 相同吗? 的相关文章

  • Laravel 5.4 升级 - 违反完整性约束 - 列不能为空

    奇怪的是 所有这些都在 5 2 中工作 但我不知道可以改变什么来实现这一点 下面是错误和正在插入的数组 SQLSTATE 23000 Integrity constraint violation 1048 Column gender can
  • 如何将 MySQL 查询输出保存到 Excel 或 .txt 文件? [复制]

    这个问题在这里已经有答案了 如何将 MySQL 查询的输出保存到 MS Excel 工作表 即使只能将数据存储在 txt文件 就可以了 From 将 MySQL 查询结果保存到文本或 CSV 文件中 http www tech recipe
  • oursql 中的参数化查询

    如果有人能告诉我是否可以使用命名占位符进行参数化查询 我将不胜感激oursql 一个用于与 MySQL 数据库交互的 python 模块 例如 我尝试了一种可以与 sqlite3 一起使用的查询 c execute select from
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 在MySQL中生成随机字符串

    我正在尝试使用函数在 phpmyadmin 中获取随机字符串 我有以下代码 CREATE FUNCTION randomPassword RETURNS varchar 128 BEGIN SET chars ABCDEFGHIJKLMNO
  • 使用来自另一个数据库的选择查询更新 mysql 表

    我有两个数据库 我想用另一个数据库表中的值更新一个表 我正在使用以下查询 但它不起作用 UPDATE database1 table1 SET field2 database2 table1 field2 WHERE database1 t
  • MySQL 可选的带有 MATCH 的 LEFT JOIN

    我有以下查询 它对 MySQL Innodb 数据库中同一搜索词的两个不同表中的两列执行全文搜索 SELECT Id MATCH tb1 comment tb2 comment AGAINST search term IN BOOLEAN
  • 没有提示指令的直连接中表的顺序是否会影响性能?

    所有基于 SQL 的 RDBMS 10 年前的版本 直接连接查询 没有提示指令 中的表顺序是否会对最佳性能和内存管理产生影响 听说最后一个join应该是最大的表 您的数据库的查询优化器如何处理这种情况 回答你的问题 是的 表的顺序在连接中有
  • MVCC 如何与 MySql 中的 Lock 配合使用?

    我知道Mysql中使用锁或者MVCC可以实现并发控制 比如可重复读 但我不知道MVCC如何避免幻读 在其他地方了解到一般是通过MVCC和Gap Lock来实现的 但是目前我理解的是MVCC不需要锁 即更新和删除都是使用undo log来实现
  • 如何删除 MySQL 数据库?

    你可能从我的上一个问题中注意到一个问题引发了更多的问题 在 MySQL 监视器中阅读 MySQL 手册 https stackoverflow com questions 1081399 我的数据库现在无法使用 部分原因是我想破坏东西并且无
  • Dapper 或 MySql 未找到包含句号“.”的存储过程。

    我有一个简单的 C 控制台 它使用 Dapper ORM 调用本地 MySql 数据库 以执行名为的存储过程users UserCreate 但是 当运行查询时 我收到一个异常 在数据库 用户 中找不到过程或函数 UserCreate Bu
  • 如何从表中检索特定列 --- JPA 或 CrudRepository?我只想从用户表中检索电子邮件列

    用户模型 Entity Table name user uniqueConstraints UniqueConstraint columnNames email public class User implements Serializab
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in
  • 使用什么框架来引导我的第一个生产 scala 项目?

    我正在第一次涉足 scala 的生产应用程序 该应用程序当前打包为 war 文件 我的计划是创建 scala 编译工件的 jar 文件 并将其添加到 war 文件的 lib 文件夹中 我的增强功能是通过 Jersey 公开的 mysql 支
  • 拥有更多列或更多行会更高效吗?

    我目前正在重新设计一个可能包含大量数据的数据库 我可以选择在数据库中包含许多不同的列或使用大量行 如果我在下面做一些大纲 可能会更容易 item id user id title description content category t
  • 条件触发器的Django迁移sql

    我想创建一个触发器 仅在满足条件时插入表 我尝试过使用 IF BEGIN END 和 WHERE 的各种组合 但 Django 每次都会返回 SQL 语法错误 这里 type user id指的是触发该事件的人 user id指的是接收到通
  • 重写 URL,将 ID 替换为查询字符串中的标题

    我对 mod rewrite 很陌生 但我做了一些搜索 但找不到这个问题的答案 我有一个网站 它只有一个 PHP 页面 根据查询字符串中传递给它的 ID 提供数十页内容 我想重写 URL 以便此 ID消失并替换为从数据库中提取的页面标题 例
  • phpActiveRecord 日期时间格式不正确

    当尝试使用 phpActiveRecord 在表中创建记录时 出现以下错误 Invalid datetime format 1292 Incorrect datetime value 2013 06 20 11 59 08 PDT for

随机推荐