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

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

学完本节课,你将能清楚地回答:

  • MySQL 中有哪些字符串类型?

  • 不同字符串类型有什么区别?

  • 如何正确选择字符串字段类型?

  • 如何存储和查询字符串数据?


一、字符串类型总览

MySQL 提供了多种字符串数据类型,常见的有:

类型名

最大长度

特点

典型用途

CHAR(n)

固定长度,最多255字符

占用固定空间,速度快

性别、国家代码等短文本

VARCHAR(n)

可变长度,最多65535字节

节省空间,使用最广泛

姓名、标题、地址等

TEXT

最多65,535字节

大量文本

文章内容、评论

MEDIUMTEXT

最多16MB

超长文本

新闻内容、小说

LONGTEXT

最多4GB

超大文本

博客、日志、文档内容

💡 提示: CHARVARCHAR 用于存储短文本; TEXT 系列用于存储大量文字。


二、CHAR 与 VARCHAR 的区别

示例:

CREATE TABLE user_info (
    username CHAR(10),
    nickname VARCHAR(10)
);
INSERT INTO user_info VALUES ('Tom', 'Tom');
INSERT INTO user_info VALUES ('Alexander', 'Alexander');

查询结果:

username

nickname

Tom······

Tom

Alexander

Alexander

区别说明:

特性

CHAR

VARCHAR

长度

固定

可变

存储空间

总是占满 n 个字符

实际内容长度 + 1字节

查询速度

较快(因为固定)

稍慢(需要计算长度)

适用场景

性别、邮政编码、国家缩写

姓名、地址、备注等


三、TEXT 类型的使用

示例:

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(100),
    content TEXT
);
INSERT INTO articles (title, content) VALUES
('MySQL入门', 'MySQL是一种开源的关系型数据库管理系统……');
SELECT title, LEFT(content, 20) AS preview FROM articles;

输出结果:

title

preview

MySQL入门

MySQL是一种开源的关系

💡 LEFT(content, 20):只显示前20个字符作为预览。


四、不同 TEXT 类型的区别

类型

最大长度

大约可存储

TINYTEXT

255字节

短文本(简介、昵称)

TEXT

64KB

一般文章

MEDIUMTEXT

16MB

小说、新闻

LONGTEXT

4GB

博客、日志文件


五、字符串类型的选择建议

使用场景

推荐类型

性别、状态、国家代码

CHAR(1) / CHAR(2)

姓名、标题、地址

VARCHAR(50~255)

文章、描述、评论

TEXT

超长内容(新闻、小说)

MEDIUMTEXT

超大文档(博客系统)

LONGTEXT


六、实践练习

1️⃣ 创建一张学生表:

CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    gender CHAR(1),
    address VARCHAR(100)
);

2️⃣ 插入几条数据:

INSERT INTO students (name, gender, address) VALUES
('张三', '男', '北京市海淀区'),
('李四', '女', '上海市浦东新区');

3️⃣ 查询所有学生:

SELECT * FROM students;

4️⃣ 更新学生地址:

UPDATE students SET address='广州市天河区' WHERE name='张三';

七、字符串长度与字符集问题

  • MySQL 的字符串长度是按 字符集字节 计算的。

  • UTF-8 中一个汉字通常占 3个字节。 所以:

    VARCHAR(10)  → 最多存 10 个字符,而不是 10 个汉字。
  • 如果需要更多汉字,请适当调大长度。


八、 初学者常见误区与坑

  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 类型)

练习目标:掌握 CHAR(n) 固定长度字符串的特点。

表中数据:

id

country_name

country_code

1

中国

CN

2

日本

JP

3

美国

US

建表语句:

CREATE TABLE countries (
    id INT AUTO_INCREMENT PRIMARY KEY,
    country_name VARCHAR(50),
    country_code CHAR(2)
) CHARSET=utf8mb4;

插入测试数据:

INSERT INTO countries (country_name, country_code) VALUES
('中国', 'CN'),
('日本', 'JP'),
('美国', 'US');

练习题 2:用户资料表(VARCHAR 类型)

练习目标:掌握 VARCHAR(n) 可变长度字符串的用法。

表中数据:

id

username

email

1

Tom

tom@example.com

2

Alice

alice2025@gmail.com

3

张三

zhangsan@163.com

建表语句:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(30),
    email VARCHAR(100)
) CHARSET=utf8mb4;

插入测试数据:

INSERT INTO users (username, email) VALUES
('Tom', 'tom@example.com'),
('Alice', 'alice2025@gmail.com'),
('张三', 'zhangsan@163.com');

练习题 3:文章内容表(TEXT 类型)

练习目标:掌握 TEXT 类型用于存储大量文字的场景。

表中数据:

id

title

content (前30字)

1

MySQL简介

MySQL 是一个开源的关系型数…

2

学习SQL的第一步

要掌握SELECT、INSERT、UP…

3

数据库优化技巧

在设计表结构时要注意索引…

建表语句:

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(100),
    content TEXT
) CHARSET=utf8mb4;

插入测试数据:

INSERT INTO articles (title, content) VALUES
('MySQL简介', 'MySQL 是一个开源的关系型数据库系统,用于高效存储结构化数据。'),
('学习SQL的第一步', '要掌握SELECT、INSERT、UPDATE等基本语句,这是数据库操作的基础。'),
('数据库优化技巧', '在设计表结构时要注意索引、范式和查询效率。');

练习题 4:小说章节表(MEDIUMTEXT 类型)

练习目标:掌握 MEDIUMTEXT 适合存储中长篇文本,如小说或新闻。

表中数据:

id

title

chapter (前20字)

1

天行者

第一章:黎明的曙光…

2

编程少年

第二章:写下第一个He…

3

未来之城

第三章:人工智能的觉…

建表语句:

CREATE TABLE novels (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(100),
    chapter MEDIUMTEXT
) CHARSET=utf8mb4;

插入测试数据:

INSERT INTO novels (title, chapter) VALUES
('天行者', '第一章:黎明的曙光……'),
('编程少年', '第二章:写下第一个Hello World的那天……'),
('未来之城', '第三章:人工智能的觉醒……');

练习题 5:博客日志表(LONGTEXT 类型)

练习目标:掌握 LONGTEXT 存储超大文本(如完整博客或报告)的使用场景。

表中数据:

id

author

blog_content (前25字)

1

Jojo

今天我学习了MySQL的字符串…

2

Lina

数据库设计的关键是根据需…

3

David

我发现TEXT类型在存储文章…

建表语句:

CREATE TABLE blogs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    author VARCHAR(50),
    blog_content LONGTEXT
) CHARSET=utf8mb4;

插入测试数据:

INSERT INTO blogs (author, blog_content) VALUES
('Jojo', '今天我学习了MySQL的字符串类型,从CHAR到LONGTEXT都有不同的应用场景……'),
('Lina', '数据库设计的关键是根据需求选择合适的数据类型,尤其是字符串类型……'),
('David', '我发现TEXT类型在存储文章时非常方便,但不能直接设置默认值。');


评论