学完本节课,你将能清楚地回答:
MySQL 中有哪些字符串类型?
不同字符串类型有什么区别?
如何正确选择字符串字段类型?
如何存储和查询字符串数据?
一、字符串类型总览
MySQL 提供了多种字符串数据类型,常见的有:
💡 提示:
CHAR
与VARCHAR
用于存储短文本;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');
查询结果:
区别说明:
三、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;
输出结果:
💡
LEFT(content, 20)
:只显示前20个字符作为预览。
四、不同 TEXT 类型的区别
五、字符串类型的选择建议
六、实践练习
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 个汉字。
如果需要更多汉字,请适当调大长度。
八、 初学者常见误区与坑
VARCHAR(n)
设得过大:错误:觉得名字最长能有多长?直接
VARCHAR(255)
。或者每个字符串字段都设置成255
。正确:应该根据业务实际情况估算合理的最大值。比如
username
可以设为50
,email
可以设为100
。这不仅是节省空间,更是一种良好的规范和约束。
混淆字符与字节:
错误:
VARCHAR(255)
以为能存255个汉字。正确:
VARCHAR(255)
能存255个字符,包括255个汉字。但这些汉字在utf8mb4
编码下可能需要255 * 4 = 1020
字节的存储空间。要确保总行大小不超过限制(约65535字节)。
滥用
TEXT
:错误:把所有文本都用
TEXT
类型,因为“省事”。正确:
TEXT
类型有特定的使用场景。对于短文本(如标题、名称),使用VARCHAR
性能更优,因为MySQL可能会在内存中创建临时表,而TEXT
类型可能会被存储在磁盘上,导致速度变慢。
忽视字符集 (
CHARSET
):错误:使用默认的
latin1
字符集,无法存储中文。正确:现在建表强烈推荐使用
utf8mb4
字符集,因为它支持完整的UTF-8编码,包括表情符号(emoji)和所有语言文字。CREATE TABLE ... CHARSET=utf8mb4;
练习题
练习题 1:国家代码表(CHAR 类型)
练习目标:掌握
CHAR(n)
固定长度字符串的特点。
表中数据:
建表语句:
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)
可变长度字符串的用法。
表中数据:
建表语句:
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
类型用于存储大量文字的场景。
表中数据:
建表语句:
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
适合存储中长篇文本,如小说或新闻。
表中数据:
建表语句:
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
存储超大文本(如完整博客或报告)的使用场景。
表中数据:
建表语句:
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类型在存储文章时非常方便,但不能直接设置默认值。');