1. 首页 > MySQL教程 > 正文

MySQL教程FG067-MySQL字符串类型详解

GF-MySQL

内容简介:本文主要介绍MySQL相关知识,包括安装、配置、优化等内容。风哥教程参考MySQL官方文档MySQL SQL Syntax、MySQL Server Administration。

Part01-基础概念与理论知识

1.1 什么是字符串类型

字符串类型是MySQL中用于存储文本数据的数据类型。MySQL提供了多种字符串类型,包括固定长度和可变长度的字符串类型,以满足不同的存储需求。

1.2 字符串类型的分类

  • 固定长度字符串:CHAR
  • 可变长度字符串:VARCHAR, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
  • 二进制字符串:BINARY, VARBINARY, TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB
  • 枚举类型:ENUM
  • 集合类型:SET

Part02-生产环境规划与建议

2.1 CHAR类型的特性

类型 最大长度 存储空间 描述
CHAR(M) 255个字符 M字节(M为1-255) 固定长度字符串

2.2 CHAR类型的使用

示例:

-- 创建包含CHAR类型的表
CREATE TABLE char_test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    code CHAR(5), -- 固定长度5个字符
    gender CHAR(1), -- 性别,固定长度1个字符
    status CHAR(2) -- 状态,固定长度2个字符
);

-- 插入数据
INSERT INTO char_test (code, gender, status) VALUES ('A1234', 'M', '01');

-- 查询数据
SELECT * FROM char_test;

-- 测试CHAR类型的填充
INSERT INTO char_test (code, gender, status) VALUES ('B567', 'F', '0');
-- 注意:插入的'F'会被填充到1个字符,'0'会被填充到2个字符
SELECT * FROM char_test;
            

2.3 CHAR类型的特点

  • 固定长度,不足时用空格填充
  • 查询时自动去除尾部空格
  • 适合存储长度固定的数据,如身份证号、邮编等
  • 存储空间固定,与实际存储的字符长度无关

Part03-生产环境项目实施方案

3.1 VARCHAR类型的特性

类型 最大长度 存储空间 描述
VARCHAR(M) 65535个字符 实际长度 + 1-2字节 可变长度字符串

3.2 TEXT类型的特性

类型 最大长度 存储空间 描述
TINYTEXT 255个字符 实际长度 + 1字节 小型文本
TEXT 65535个字符 实际长度 + 2字节 普通文本
MEDIUMTEXT 16777215个字符 实际长度 + 3字节 中等长度文本
LONGTEXT 4294967295个字符 实际长度 + 4字节 长文本

3.3 可变长度字符串类型的使用

示例: 01 更多视频教程www.fgedu.net.cn

-- 创建包含可变长度字符串类型的表
CREATE TABLE varchar_text_test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50), -- 姓名,可变长度
    description TEXT, -- 描述,普通文本
    content LONGTEXT, -- 内容,长文本
    notes TINYTEXT -- 备注,小型文本
);

-- 插入数据
INSERT INTO varchar_text_test (name, description, content, notes) 
VALUES (
    'MySQL教程',
    '这是一个MySQL字符串类型的教程',
    '本教程详细介绍了MySQL的各种字符串类型,包括CHAR、VARCHAR、TEXT等类型的特性和使用方法。\n\n通过本教程,您将了解:\n1. 字符串类型的分类\n2. 各种字符串类型的特性\n3. 字符串类型的使用场景\n4. 字符串类型的最佳实践\n5. 常见错误与解决方案',
    '学习笔记'
);

-- 查询数据
SELECT * FROM varchar_text_test;
            

3.4 可变长度字符串类型的特点

  • 长度可变,根据实际存储的字符长度分配空间
  • 不会自动填充空格
  • 适合存储长度不固定的数据,如姓名、描述等
  • 存储空间与实际存储的字符长度相关

Part04-生产案例与实战讲解

4.1 二进制字符串类型的特性

类型 最大长度 存储空间 描述
BINARY(M) 255字节 M字节 固定长度二进制字符串
VARBINARY(M) 65535字节 实际长度 + 1-2字节 可变长度二进制字符串
TINYBLOB 255字节 实际长度 + 1字节 小型二进制数据
BLOB 65535字节 实际长度 + 2字节 普通二进制数据
MEDIUMBLOB 16777215字节 实际长度 + 3字节 中等长度二进制数据
LONGBLOB 4294967295字节 实际长度 + 4字节 长二进制数据

4.2 二进制字符串类型的使用

示例: 02 学习交流加群风哥微信: itpux-com

-- 创建包含二进制字符串类型的表
CREATE TABLE binary_test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    image BLOB, -- 存储图片
    file LONGBLOB, -- 存储文件
    hash BINARY(16), -- 存储MD5哈希值
    data VARBINARY(100) -- 存储可变长度二进制数据
);

-- 插入二进制数据(示例)
-- 注意:实际插入二进制数据通常通过程序实现
INSERT INTO binary_test (hash, data) 
VALUES (UNHEX('5d41402abc4b2a76b9719d911017c592'), 'Binary data');

-- 查询数据
SELECT id, HEX(hash), data FROM binary_test;
            

4.3 二进制字符串类型的特点

  • 存储二进制数据,如图片、文件等
  • 区分大小写
  • 适合存储不需要字符集转换的数据

Part05-风哥经验总结与分享

5.1 ENUM类型的特性

类型 最大成员数 存储空间 描述
ENUM(‘value1′,’value2’,…) 65535个成员 1-2字节 枚举类型,只能存储其中一个值

5.2 SET类型的特性

类型 最大成员数 存储空间 描述
SET(‘value1′,’value2’,…) 64个成员 1-8字节 集合类型,可以存储多个值

5.3 枚举和集合类型的使用

示例:

-- 创建包含枚举和集合类型的表
CREATE TABLE enum_set_test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    gender ENUM('男', '女', '其他'), -- 性别枚举
    status ENUM('活跃', '禁用', '删除'), -- 状态枚举
    hobbies SET('阅读', '运动', '音乐', '旅行', '游戏'), -- 爱好集合
    skills SET('Java', 'Python', 'MySQL', 'HTML', 'CSS') -- 技能集合
);

-- 插入数据
INSERT INTO enum_set_test (gender, status, hobbies, skills) 
VALUES ('男', '活跃', '阅读,运动,音乐', 'Java,MySQL');

-- 查询数据
SELECT * FROM enum_set_test;

-- 使用FIND_IN_SET函数查询
SELECT * FROM enum_set_test WHERE FIND_IN_SET('运动', hobbies) > 0;
SELECT * FROM enum_set_test WHERE FIND_IN_SET('Java', skills) > 0;
            

5.4 枚举和集合类型的特点

  • ENUM
    • 只能存储枚举中的一个值
    • 存储效率高
    • 适合存储有限的选项,如性别、状态等
  • SET
    • 可以存储多个值
    • 使用位运算存储,存储效率高
    • 适合存储多个选项,如爱好、技能等

6. 字符串类型的最佳实践

6.1 CHAR与VARCHAR的选择

  • 使用CHAR的场景
    • 数据长度固定,如身份证号、邮编、手机号码等
    • 数据长度较短,如性别、状态等
    • 需要快速查询的场景
  • 使用VARCHAR的场景
    • 数据长度不固定,如姓名、地址等
    • 数据长度较长,如产品描述等
    • 需要节省存储空间的场景

6.2 TEXT类型的使用

  • 根据文本长度选择合适的TEXT类型
  • 避免在TEXT列上创建索引,会影响性能
  • 对于需要频繁查询的文本,考虑使用VARCHAR
  • 对于大文本,如文章内容,使用LONGTEXT

6.3 二进制字符串类型的使用

  • 对于小文件,如图片缩略图,使用BLOB
  • 对于大文件,使用LONGBLOB
  • 考虑将大文件存储在文件系统中,只在数据库中存储文件路径

6.4 枚举和集合类型的使用

  • 对于有限的选项,使用ENUM
  • 对于多个选项的组合,使用SET
  • 注意ENUM和SET的值是大小写敏感的
  • 避免在ENUM和SET中使用过多的成员

7. 常见错误与解决方案

7.1 字符串长度溢出

问题:插入的字符串长度超过了字段定义的长度 03 学习交流加群风哥QQ113257174

解决方案:选择合适的字符串类型,或增加字段长度

7.2 索引效率问题

问题:在长字符串列上创建索引影响性能

解决方案:对于长字符串,考虑使用前缀索引,或使用VARCHAR替代TEXT

7.3 字符集问题

问题:字符串存储时出现乱码

解决方案:确保数据库、表和列的字符集一致,使用UTF-8编码

7.4 存储空间浪费

问题:使用了过大的字符串类型

解决方案:根据实际数据长度选择合适的字符串类型 04 风哥提示:

8. 示例:综合使用字符串类型

示例:用户表设计 05更多学习教程公众号风哥教程itpux_com

CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE, -- 用户名
    password VARCHAR(255) NOT NULL, -- 密码
    email VARCHAR(100) NOT NULL UNIQUE, -- 邮箱
    phone CHAR(11) NOT NULL, -- 手机号码,固定长度
    gender ENUM('男', '女', '其他') DEFAULT '其他', -- 性别
    address VARCHAR(255), -- 地址
    bio TEXT, -- 个人简介
    avatar BLOB, -- 头像
    hobbies SET('阅读', '运动', '音乐', '旅行', '游戏'), -- 爱好
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间
);

-- 插入用户数据
INSERT INTO users (username, password, email, phone, gender, address, bio, hobbies) 
VALUES (
    'admin',
    'password123',
    'admin@fgedu.net.cn',
    '13800138000',
    '男',
    '北京市朝阳区',
    '系统管理员',
    '阅读,音乐,旅行'
);

-- 查询用户
SELECT * FROM users;
            

示例:产品表设计 06 from mysql视频:www.itpux.com

CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    sku CHAR(10) NOT NULL UNIQUE, -- 产品SKU,固定长度
    name VARCHAR(100) NOT NULL, -- 产品名称
    description TEXT, -- 产品描述
    long_description LONGTEXT, -- 详细描述
    price DECIMAL(10,2) NOT NULL, -- 价格
    status ENUM('在售', '下架', '缺货') DEFAULT '在售', -- 状态
    tags SET('热门', '新品', '促销', '推荐'), -- 标签
    image BLOB, -- 产品图片
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间
);

-- 插入产品数据
INSERT INTO products (sku, name, description, price, status, tags) 
VALUES (
    'P1234567890',
    'iPhone 14',
    '苹果最新款手机',
    5999.99,
    '在售',
    '热门,推荐'
);

-- 查询产品
SELECT * FROM products;
            

9. 总结

本教程详细介绍了MySQL的字符串类型,包括:

  • 固定长度字符串:CHAR
  • 可变长度字符串:VARCHAR, TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
  • 二进制字符串:BINARY, VARBINARY, TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB
  • 枚举类型:ENUM
  • 集合类型:SET
  • 字符串类型的最佳实践
  • 常见错误与解决方案

选择合适的字符串类型对于数据库的性能、存储效率和数据完整性都非常重要。在实际项目中,应根据具体的业务需求和数据特点,选择最适合的字符串类型。对于长度固定的数据,应使用CHAR类型;对于长度不固定的数据,应使用VARCHAR或TEXT类型;对于二进制数据,应使用BINARY或BLOB类型;对于有限的选项,应使用ENUM或SET类型。

提示:在设计表结构时,应仔细考虑每个字符串字段的长度和使用场景,选择合适的字符串类型,以提高数据库的性能和存储效率。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息