Administrator
发布于 2025-09-07 / 7 阅读
0
0

MySQL第6课:字符串类型详解

掌握字符串类型是高效、准确设计数据库表的基础。本文将从 “是什么”、“怎么选”、“怎么用” 三个层面,结合初学者的常见误区来讲解。


一、 核心字符串类型:认识它们 (是什么?)

MySQL最常用的字符串类型主要有以下四种,记住它们的特点:

类型

中文名

最大长度

特点与用途

举例

CHAR(n)

定长字符串

255 字符

固定长度。声明n后,无论实际存储多少字符,都会占用n个字符的空间。存取效率高

CHAR(10)"abc",依然占10字符空间。

VARCHAR(n)

变长字符串

65535 字节 (但受制于行最大65535字节)

可变长度。只用实际内容所需的空间+1到2个字节来记录长度。节省空间

VARCHAR(10)"abc",只占3字符+1字节的空间。

TEXT

文本数据

65535 字节 (~64KB)

专门用于存储大段文本(如文章、日志)。在存储机制上与VARCHAR不同,不占用表结构的“行”空间。

存储一篇博客文章的内容。

ENUM

枚举类型

65535 个成员

预定义一个可选值列表。存储时只存值的序号,非常紧凑高效。

ENUM('小', '中', '大')‘中’,实际只存数字2

重要概念澄清:长度单位

  • CHAR(n)VARCHAR(n) 中的 n 指的是字符数,而不是字节数。

  • 这意味着,如果你设置 n=10,它可以存储10个英文字母,也可以存储10个汉字(尽管一个汉字可能占用3个字节)。


二、 如何选择?—— 初学者选择指南

这是最关键的一步。遵循以下决策流程,你就能做出正确选择:

Syntax error in textmermaid version 11.4.1

ERROR: [Mermaid] Parse error on line 9: ...、UUID) --> G[使用 CHAR(n) 类型] F -- 否 - -----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'

补充说明:

  • CHAR vs VARCHARCHAR 的固定长度特性使其在存储非常短且长度可预测的数据时极具优势(如MD5哈希值(32位)手机号身份证号),因为计算和访问固定长度的记录速度更快。对于长度多变的(如姓名、地址),VARCHAR 是毫无疑问的选择。

  • VARCHAR vs TEXTTEXT 类型的数据在存储时,数据库会将大部分内容存储在单独的区域,而不是与其他行数据紧挨着。这使得SELECT * 查询可能会更慢一些。因此,短的文本用VARCHAR,长的、不确定长度的文本用TEXT


三、 实战与常用操作 (怎么用?)

1. 建表时定义字段

CREATE TABLE `users` (
  `id` INT PRIMARY KEY AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL,        -- 用户名,可变长度,最长50字符
  `gender` ENUM('男', '女', '保密') DEFAULT '保密', -- 性别,从三个值里选
  `mobile` CHAR(11) NOT NULL,             -- 手机号,固定11位,用CHAR
  `signature` VARCHAR(100),               -- 个性签名,短文本,用VARCHAR
  `article` TEXT,                         -- 写的文章,长文本,用TEXT
  `uuid` CHAR(36)                         -- UUID是固定36位的字符串
);

2. 插入数据 (INSERT)

INSERT INTO `users` (`username`, `gender`, `mobile`, `signature`, `article`)
VALUES (
    '张三', 
    '男', 
    '13812345678', 
    '这是一个简单的签名。',
    '这是一篇非常长的文章内容...(此处省略几千字)'
);

3. 查询与过滤 (SELECT/WHERE)

字符串类型的查询非常灵活:

-- 精确匹配
SELECT * FROM `users` WHERE `gender` = '男';
SELECT * FROM `users` WHERE `mobile` = '13812345678';
​
-- 模糊查询 (LIKE)
SELECT * FROM `users` WHERE `username` LIKE '张%'; -- 找姓张的用户
SELECT * FROM `users` WHERE `signature` LIKE '%简单%'; -- 查找签名中包含“简单”的用户

四、 初学者常见误区与坑

  1. VARCHAR(n) 设得过大

    • 错误:觉得名字最长能有多长?直接 VARCHAR(255)。或者每个字符串字段都设置成 255

    • 正确:应该根据业务实际情况估算合理的最大值。比如username可以设为50email可以设为100。这不仅是节省空间,更是一种良好的规范和约束。

  2. 混淆字符与字节

    • 错误VARCHAR(255) 以为能存255个汉字。

    • 正确VARCHAR(255) 能存255个字符,包括255个汉字。但这些汉字在utf8mb4编码下可能需要 255 * 4 = 1020 字节的存储空间。要确保总行大小不超过限制(约65535字节)。

  3. 滥用 TEXT

    • 错误:把所有文本都用TEXT类型,因为“省事”。

    • 正确TEXT类型有特定的使用场景。对于短文本(如标题、名称),使用VARCHAR性能更优,因为MySQL可能会在内存中创建临时表,而TEXT类型可能会被存储在磁盘上,导致速度变慢。

  4. 忽视字符集 (CHARSET)

    • 错误:使用默认的latin1字符集,无法存储中文。

    • 正确:现在建表强烈推荐使用 utf8mb4 字符集,因为它支持完整的UTF-8编码,包括表情符号(emoji)和所有语言文字。

      CREATE TABLE ... CHARSET=utf8mb4;

总结与练习建议

  1. 理解核心:记住 CHAR(定长快)、VARCHAR(变长省空间)、TEXT(大文本)、ENUM(固定列表)这四者的区别和用途。

  2. 动手实践

    • 创建一个测试表,尝试各种类型。

    • 故意插入超长的数据,看看MySQL的反应(会报错或截断)。

    • 使用 LENGTH()(返回字节数)和 CHAR_LENGTH()(返回字符数)函数来查询数据的长度,加深理解。

    • 尝试使用不同的字符集(如latin1),看存储中文时会出现什么错误。


评论