【问题标题】:MySQL fixed-length and variable-length data typesMySQL 定长和变长数据类型
【发布时间】:2011-10-12 13:26:17
【问题描述】:

我正在优化数据库,但我对固定长度数据类型还不清楚。

据我所知,这些数据类型是固定长度

  • CHAR(n)
  • 日期
  • 时间
  • 日期时间
  • TINYINT
  • SMALLINT
  • 中号
  • INT
  • 浮动
  • 双重

这些是可变长度

  • 文本
  • VARCHAR
  • BLOB

如有错误请指正!

现在,我的问题是:这些数据类型是固定长度还是可变长度?

  • 时间戳
  • 枚举

谢谢。

【问题讨论】:

  • 这是一个非常广泛的问题
  • 已更新以更好地理解我的问题。其实我只是想知道我对固定长度数据类型的了解是否正确?而TIMESTAMP、ENUM是定长还是变长数据类型? (共 2 个问题)
  • 时间戳和枚举是固定长度的类型。

标签: mysql types


【解决方案1】:

您在某些数据类型上不正确。

日期时间/时间戳

TIMESTAMPDATETIME 相似,但是与DATETIME 相比,TIMESTAMP 只使用了一半的存储空间。然而,使用TIMESTAMP 有明显的缺点,因此您应该查看官方文档以了解您需要哪一个。但大多数DATETIME 会是更好的选择。

您不必担心此数据类型的固定/可变长度

数字

您可以通过设置长度来存储整数,即int(20),但就存储而言,它没有区别,因此没有意义。

TINYINT SMALL INT MEDIUMINT BIGINT

这些数据类型分别需要 8、16、24、32 和 64 位的存储空间。它们中的每一个都有不同的最大值和最小值。如果您确定您的值不会超过某个数字,则应选择最小的 int 数据类型以节省空间并提高性能。有关这些数字的更多信息,您应该查阅官方文档。

FLOATDOUBLE 是近似计算,您不必指定精度。设置精度并插入超出规范的值,您的值将四舍五入到规范。再次查看官方文档。

VARCHAR

VARCHAR,正如您所期望的那样是可变长度的,但请记住,当您只需要 5 个字符时不要指定类似 VARCHAR(100) 的内容,因为虽然存储在磁盘上时长度是可变的,但它需要您在使用 RAM 时指定的长度,因此您将浪费宝贵的内存。

BLOB 和文本

BLOBTEXT 以特殊方式存储,具体取决于您使用的存储引擎。它们通常存储在“外部”区域。除非字符串 VERY 长,否则您应该避免使用它。此数据类型无法索引全长,并且内存也不支持,因此系统内存不使用此数据类型。当调用它时,将使用 MyISAM 存储引擎在磁盘上创建一个临时表,这会导致性能大幅下降。

枚举

这非常紧凑,您可以在创建表时为字段设置特定值。字符串是固定的,更改ENUM 列需要ALTER TABLE,因此您不必担心此字符串的固定/可变长度。

编辑:

我在官方文档中找到了一个页面,可以回答您的所有问题Data Type Storage Requirements

【讨论】:

  • 不清楚我错在哪里。我已阅读官方文件以了解您在说什么(与官方文件相同),但它们并不是我问题的直接答案。如果您误解了我,fixed-lenth 指的是 staticvariable-length 指的是 dynamic。还是谢谢你!
  • 如果您指的是固定存储空间,那么是的,您大部分是正确的。 FLOAT 如果它有 0 到 24 位数字,则将值存储为 4 个字节,如果有 25 到 53 位数字,则存储为 8 个字节。此外TIME DATE DATETIME TIMESTAMP 都占用了固定数量的存储空间。请记住 BLOB 和 TEXT 的缺点。
  • 添加了一个可以帮助你的链接
  • @bash- 您提供的链接也回答了有关枚举的问题:1 或 2 个字节,取决于枚举值的数量(最多 65,535 个值)
猜你喜欢
  • 2012-09-21
  • 2022-01-08
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多