前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【重学 MySQL】五十八、文本字符串(包括 enum set)类型

【重学 MySQL】五十八、文本字符串(包括 enum set)类型

作者头像
用户11332765
发布2024-10-28 17:25:58
发布2024-10-28 17:25:58
13600
代码可运行
举报
文章被收录于专栏:编程编程
运行总次数:0
代码可运行
【重学 MySQL】五十八、文本字符串(包括 enum set)类型

在 MySQL 中,文本字符串类型用于存储字符数据。这些类型包括 CHARVARCHARTEXT 系列(如 TINYTEXTTEXTMEDIUMTEXTLONGTEXT)、ENUMSET。每种类型都有其特定的用途和存储特性。

CHAR 和 VARCHAR

  • CHAR(n):
    • 固定长度字符类型。
    • 如果存储的字符串长度小于 n,则会在右侧填充空格以达到长度 n
    • 适用于存储长度几乎相同的字符串,如国家代码、邮政编码等。
    • 存储空间是固定的,不依赖于实际存储的字符串长度。
  • VARCHAR(n):
    • 可变长度字符类型。
    • 实际存储空间是字符串长度加上 1 或 2 个字节(用于存储字符串长度)。
    • 适用于存储长度变化较大的字符串,如人名、电子邮件地址等。
    • 最大长度为 65,535 字节(实际最大长度取决于字符集和最大行大小)。

哪些情况使用 CHAR 或 VARCHAR 更好

类型

特点

空间上

时间上

适用场景

CHAR(M)

固定长度

浪费存储空间

效率高

存储不大,速度要求高

VARCHAR(M)

可变长度

节省存储空间

效率低

非CHAR的情况

  • 情况1:存储很短的信息。比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的,结果得不偿失。
  • 情况2:固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。
  • 情况3:十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。
  • 情况4:具体存储引擎中的情况:
    • MyISAM 数据存储引擎和数据列:MyISAM数据表,最好使用固定长度(CHAR)的数据列代替可变长度(VARCHAR)的数据列。这样使得整个表静态化,从而使数据检索更快,用空间换时间。
    • MEMORY 存储引擎和数据列:MEMORY数据表目前都使用固定长度的数据行存储,因此无论使用CHAR或VARCHAR列都没有关系,两者都是作为CHAR类型处理的。
    • InnoDB存储引擎,建议使用VARCHAR类型。因为对于InnoDB数据表,内部的行存储格式并没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),而且主要影响性能的因素是数据行使用的存储总量,由于char平均占用的空间多于varchar,所以除了简短并且固定长度的,其他考虑varchar。这样节省空间,对磁盘I/O和数据存储总量比较好。

TEXT 系列

  • TINYTEXT:
    • 最大长度为 255 字节。
  • TEXT:
    • 最大长度为 65,535 字节(约 64 KB)。
  • MEDIUMTEXT:
    • 最大长度为 16,777,215 字节(约 16 MB)。
  • LONGTEXT:
    • 最大长度为 4,294,967,295 字节(约 4 GB)。
  • 特点:
    • 适用于存储大量文本数据,如文章、评论等。
    • 存储和检索速度通常比 CHARVARCHAR 慢。

ENUM

  • ENUM(‘value1’, ‘value2’, …, ‘valueN’):
    • 枚举类型,允许存储一个预定义集合中的一个值。
    • 枚举值在内部以整数存储,但显示时以字符串形式呈现。
    • 适用于存储具有固定选项集合的字段,如性别(‘男’, ‘女’)、状态(‘启用’, ‘禁用’)等。
    • 枚举值在定义时必须是字符串常量,且区分大小写。

SET

  • SET(‘value1’, ‘value2’, …, ‘valueN’):
    • 集合类型,允许存储一个预定义集合中的一个或多个值(以逗号分隔)。
    • 类似于 ENUM,但允许存储多个值。
    • 适用于存储具有多个选项的字段,如兴趣爱好(‘阅读’, ‘旅行’, ‘运动’)等。
    • 集合值在内部以整数存储,但显示时以字符串形式呈现。
    • 每个集合成员在定义时必须是字符串常量,且区分大小写。

示例

代码语言:javascript
代码运行次数:0
复制
CREATE TABLE example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    fixed_char CHAR(10),
    variable_char VARCHAR(255),
    short_text TINYTEXT,
    long_description TEXT,
    gender ENUM('Male', 'Female', 'Other'),
    hobbies SET('Reading', 'Traveling', 'Sports', 'Cooking')
);

INSERT INTO example (fixed_char, variable_char, short_text, long_description, gender, hobbies)
VALUES ('ABC     ', 'Variable Length String', 'Short Text', 'This is a long description.', 'Male', 'Reading,Sports');

注意事项

  1. 字符集和排序规则
    • 字符类型字段可以指定字符集和排序规则(collation),以支持多语言存储和比较。
    • 常用的字符集包括 utf8utf8mb4latin1 等。
  2. 存储和性能
    • CHARVARCHAR 类型的字段在存储和检索时通常比 TEXT 类型的字段更快。
    • 对于大量文本数据,使用 TEXT 类型字段更为合适。
  3. 索引
    • CHARVARCHARTEXT 字段都可以创建索引,但 TEXT 字段的索引有一些限制(如前缀索引)。
    • ENUMSET 字段也可以创建索引,且索引效率通常较高。

通过了解这些文本字符串类型及其特性,可以更好地设计数据库表结构,以满足不同应用场景的需求。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【重学 MySQL】五十八、文本字符串(包括 enum set)类型
  • CHAR 和 VARCHAR
  • TEXT 系列
  • ENUM
  • SET
  • 示例
  • 注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档