MySQL知识点(上)
MySQL知识点
一:MySQL概述
MySQL是一款开源的数据库软件,是一种关系型数据库管理系统(ROBMS),也叫做表数据库管理系统
如果需要快速安全地处理大量的数据,则必须使用数据库管理系统;任何基于数据库编程的程序,其本质都是对数据的处理操作;通过使用数据库,数据便可以被动态地展示;只有与数据库相结合,才能充分地发挥动态网页编程语言的魅力
(1)数据库(DB)
存放数据的仓库
(2)数据库管理系统(DBMS)
是一个操作和管理数据库的系统软件,主要负责存储和管理网站所需的内容数据,用于建立;使用和维护数据库
(3)数据库系统(DBS)
由数据库;数据库管理系统;应用系统和用户共同组成
二:MySQL服务器的启动和退出
每一行命令结束后,记得按回车键(Enter)
1.MySQL服务器的启动与关闭
(1)启动MySQL服务器
首先,以管理员的身份运行命令提示符,输入命令来启动mysql
服务器:
net start mysql版本号
net start mysql版本号
是Windows系统命令,需要管理员权限运行,用于启动在Windows服务中注册的MySQL服务进程,使MySQL服务进程(mysqld.exe
)开始运行
在MySQL服务未运行时,使用该命令启动服务之后才能通过客户端连接服务器(仅启动服务,不涉及用户登录和数据库操作)
(2)关闭MySQL服务器
以下两种命令都可以关闭MySQL数据库服务器
net stop mysql版本号
net stop mysql版本号
是Windows系统命令,非MySQL自身命令,需要管理员权限运行,用于停止在Windows服务中注册的名为 “mysql版本号
” 的MySQL服务进程(命令中的服务名需与实际安装名称一致)
SHUTDOWN
SHUTDOWN
是通用方法,需在命令行中执行,而不是MySQL客户端内,要管理员权限
2.MySQL服务器的连接与退出
(1)连接MySQL服务器
首先,打开命令行窗口,输入命令:
用于连接数据库服务器,进入MySQL:
mysql -h 服务器名称/IP地址 -u 用户名 -p用户密码
- -h:指定的是所连接的数据库服务器地址,如果连接的是本机,该参数可以省略
- -u:指定连接数据库服务器使用的用户名(如:root表示管理员身份)
- -p:指定连接数据库服务器使用的密码,-p和其后的参数值之间不允许有空格;也可以省略-p后面的参数值,按回车键(Enter)后以密文的形式输入密码
所以可以简写为:
mysql -u 用户名 -p密码
mysql -u 用户名 -p密码
是MySQL客户端命令,用于指定用户(如:root)身份登录到已经运行的MySQL服务器(仅用于客户端连接,而非启动MySQL服务,需要MySQL服务已经处于运行状态时使用)
在MySQL服务启动后,通过此命令连接到服务器,进入MySQL命令行界面进行数据库操作
(2)退出MySQL服务器
以下两种命令都可以退出MySQL数据库服务器
exit
quit
exit
和 quit
是MySQL客户端命令,用于退出MySQL命令行交互界面(MySQL控制台)
exit
和 quit
的功能完全相同,只是别名关系,均用于退出MySQL客户端,不会影响MySQL服务器;执行后仅关闭当前客户端会话,服务器进程(如:mysqld.exe
)仍在运行
3.对于启动与连接;关闭与退出的区分
(1)启动与连接
net start mysql版本号 | mysql -u 用户名 -p密码 | |
---|---|---|
作用: | 启动MySQL Windows服务 | 指定用户身份登录MySQL服务器 |
使用场景: | MySQL服务未运行时启动服务 | MySQL服务已运行时连接服务器 |
用户登录: | 不涉及用户登录 | 涉及用户登录 |
net start mysql版本号
:仅启动服务,无法直接进行数据库操作,此命令需要管理员权限
mysql -u 用户名 -p密码
:仅用于登录,无法启动服务,需要具有相应权限的MySQL用户
(2)关闭与退出
net stop mysql版本号 | SHUTDOWN | exit 和 quit | |
---|---|---|---|
作用: | 关闭MySQL Windows服务 | 关闭MySQL服务 | 用于退出客户端会话 |
使用位置: | 在Windows命令行中使用 | 在MySQL命令行中使用 | 在MySQL客户端内使用 |
是否影响服务器: | 影响服务器 | 影响服务器 | 不影响服务器 |
4.一些名词解释及问题
(1)MySQL命令行
通过操作系统的终端(命令提示符)直接访问MySQL服务器的一种方式
MySQL命令行是基于命令行界面的工具,用户通过输入特定的MySQL命令来与MySQL服务器进行交互
启动方式:
打开终端(命令提示符)输入 mysql -u 用户名 -p密码
,回车(Enter)后即可进入MySQL命令行
(2)MySQL客户端
MySQL客户端包括所以可以与MySQL服务器进行通信的应用程序,既包含命令行工具(前面提到的MySQL命令行),也包含图形化界面工具
MySQL命令行是MySQL客户端的一种具体实现形式
(3)Windows命令行
Windows命令行是Windows操作系统提供的一个基于命令行的用户界面,允许用户通过输入命令来执行各种系统操作和程序,并不直接与MySQL服务器交互
虽然Windows命令行并不能直接执行MySQL的SQL命令,但可以通过它来启动MySQL服务,使其连接到MySQL命令行等
启动方式:
按下 “Win+R” 键打开 “运行对话框” ,输入 “cmd
” 并回车(Enter),即可打开Windows命令提示符窗口
(4)为什么需要先启动服务(MySQL服务的作用)
- 后台进程:MySQL服务(mysqld.exe或mysqld)是一个后台运行的守护进程,该进程负责监听客户端的连接请求(默认端口号3306);管理数据库文件(如:数据表;索引等);执行SQL操作等
- 服务化设计:
- 自动管理: 开机自动启动,避免手动操作
- 隔离性: 服务在后台运行,用户无需关心进程细节
- 资源控制: 服务管理器可限制资源占用
如果服务未运行,MySQL客户端将无法连接到MySQL服务器,数据库文件也将无法被访问,客户端登录的前提条件是MySQL服务已启动
何时需要手动启动服务:
- 首次安装后: MySQL服务默认为未启动,所以需要手动启动
- 服务崩溃或者是异常停止: 当系统重启后服务未自动恢复时
- 开发调试时: 临时重启服务后
(5)为什么mysql -u 用户名 -p密码
可以直接登录而无需手动启动服务
- 如果MySQL服务被设置为自动启动,则在系统启动时会自动执行,无需手动干预
- 一旦通过
net start mysql版本号
启动服务,则服务会持续运行,直到显示停止(如通过net stop mysql版本号
来关闭服务或系统重启)在后续客户端登录时,服务已经处于运行状态则无需再次启动
mysql -u 用户名 -p密码
是客户端命令,执行流程如下:
- 检查服务状态: 客户端尝试连接MySQL的默认端口号(3306)
- 若服务未运行: 连接失败
- 若服务已运行: 客户端会发送认证请求(用户名和密码)服务端验证权限后建立会话
注意:
用户很可能因为服务自动启动从而忽略这一过程
操作 | 作用对象 | 执行环境 | 服务状态 | 作用场景 |
---|---|---|---|---|
net start mysql版本号 | MySQL服务进程 | Windows命令行 | 启动服务 | 首次安装或服务崩溃后恢复 |
mysql -u 用户名 -p密码 | MySQL客户端会话 | MySQL命令行客户端 | 依赖服务已运行 | 日常数据库操作或开发调试 |
(6)为什么MySQL要设计为”服务化“
MySQL作为服务运行,提供了稳定性;可管理性;安全性和并发性,是数据库系统的标准架构,理解这一机制有助于更高效地排查连接问题
- 稳定性: 服务进程与用户会话分离,避免了因用户退出导致数据库崩溃
- 可管理性: 通过服务管理器(如systemd)可监控进程状态,限制资源占用
- 安全性: 服务可配置为以非特权用户运行(如mysql用户),降低系统风险
- 并发性: 服务可同时处理多个客户端连接,支持高并发访问
(7)设置MySQL服务为自动启动
按下 “Win+R
” 键,打开 “运行” 对话框,在文本框中输入 services.msc
,按下回车,此时打开服务管理器,找到MySQL服务,右键点击选择 “属性” ,最后将启动类型改为自动
(8)如何确认服务是否运行
sc query mysql版本号
(9)若客户端登录失败,但服务已启动
netstat -ano | findstr 3306
使用此命令可以帮助检查以下问题
-
端口监听状态:
正常情况会显示
LISTENING
状态,表明 MySQL 正在 3306 端口监听连接若未显示任何结果,说明服务未正确绑定 3306 端口(可能配置了其他端口或服务启动异常)
-
监听地址:
显示
0.0.0.0:3306
表示允许所有 IP 连接显示
127.0.0.1:3306
表示仅允许本地连接(远程客户端无法访问) -
防火墙排查:
若端口处于监听状态但仍无法连接,需检查防火墙是否放行 3306 端口
(10)用net stop mysql版本号
关闭服务的原因及作用
net stop mysql版本号
是Windows系统命令,用于停止以服务形式运行运行的MySQL后台进程(mysqid.exe)- 关闭服务会释放系统资源(内存;端口号等)并确保数据库处于安全状态,避免数据损坏或丢失
使用场景:
- 系统维护: 在进行系统升级,配置修改或硬件维护时,需先停止MySQL服务
- 故障排查: 当MySQL服务出现异常时,可通过关闭服务重启来解决问题
- 资源释放: 长时间运行的MySQL服务可能占用较多的系统资源,关闭后可释放资源供其他程序使用
(11)exit
命令的作用及与关闭服务的区别
exit
是MySQL客户端命令,用于退出当前与MySQL服务器的交互会话,以释放客户端占用的资源- 执行
exit
后,用户会返回操作系统命令行界面,但MySQL服务进程仍会运行,其他客户端仍可连接
exit
与直接关闭服务的区别:
- 操作对象不同:
net stop mysql版本号
作用于MySQL服务进程
exit
作用于MySQL客户端会话
- 影响范围不同:
net stop mysql版本号
用于停止整个MySQL服务,所有客户端的连接都会中断
exit
仅用于终止当前客户端会话,不影响其他客户端和服务本身
- 使用场景不同:
net stop mysql版本号
在需要完全停止MySQL服务时使用
exit
在完成数据库操作后退出客户端时使用
5.sc命令于net命令的区别
(1)启动服务
sc start mysql版本号
(2)停止服务
sc stop mysql版本号
(3)重启服务
sc restart mysql版本号
(4)获取服务状态
sc query mysql版本号
sc
命令和net
命令均用于管理服务,二者具体区别如下:
- 命令来源与底层机制:
sc
命令是Windows系统中用于与服务控制管理器(scm
)交互的命令行工具,属于系统原生工具,它直接调用服务控制端口,底层操作更贴近系统服务管理机制,适合需要精确控制服务参数的场景net
命令是Windows系统中用于管理网络资源及服务的传统工具,通过封装系统API来实现服务启动,兼容性更好,适合常规服务管理操作
- 功能差异:
sc
命令支持传递附加参数(如:依赖服务;启动超时设置等),它提供了更详细的服务状态反馈(如:错误代码;进程ID等)便于诊断问题net
命令的功能相对简单,不提供参数化配置能力,输出信息更简洁,适合快速操作
- 使用场景推荐:
sc
命令适合开发调试或故障排查时使用net
命令适合日常快速启动服务及需要兼容旧版Windows系统时使用
- 核心区别
sc
命令更底层;功能更丰富,适合高级管理net
命令更简单直接,适合日常操作
三:操作MySQL数据库
- 每个数据库都有唯一的数据库文件名作为与其他数据库区别的标识
- MySQL数据库分为系统数据库(DBMS)和自建数据库两种类型
- 安装MySQL后,系统自动创建的数据库称为系统数据库
系统数据库有:
mysql
;information_schema
;performance_schema
;sys
其中,MySQL数据库服务器把有关数据库的信息存储在mysql
和information_schema
这两个数据库中,如果删除了这两个数据库,MySQL数据库服务器将无法正常工作
关系数据库中的名词术语:
- 列: 也叫字段;属性;数据项
- 行: 也叫元组;记录
- 表: 也叫关系
- 表内容: 也叫值
- 表标题: 也叫格式
- 候选码: 唯一识别元组
- 主键: 当有多个候选码时选一个作为主键
其中,表是最基本的数据对象,用于存放数据库的数据,一个数据库中包含多个数据表;候选码具有唯一性且可以有多个;主键只能有1个(1个指的是一列或由多列组成的复合列)
1.对MySQL数据库的操作
(1)创建数据库
CREATE DATABASE 数据库名;
SQL语句在Windows和MacOS的环境中不区分字符的大小写,但在Linux环境中严格区分大小写
数据库的命名规则:
- 不能与其他数据库重名
- 名称可以使用字母;阿拉伯数字;下划线(_)或$中的任意字符开头,但要避免使用单独的数字
- 禁止使用MySQL关键字作为数据库及数据表名
- 建议使用小写字母来定义数据库及数据表名
- 名称最长可为64个字符(包括表;列和索引的命名),而别名最多可达256个字符
注意:
- 所有的SQL语句命令的最后都以英文分号 “
;
” 结尾 - 数据库名;表名;列名最好不要使用中文命名
(2)查看当前数据库
SHOW DATABASES;
用于显示当前本地MySQL数据库服务器下的所有已经存在的数据库名
(3)选择数据库
USE 数据库名;
用于指定一个数据库,使其成为当前使用的数据库
(4)删除数据库
DROP DATABASE 数据库名;
用于删除指定的数据库,一旦执行,数据库中的所有结构和数据都会被删除,没有恢复的可能,除非有备份
(5)数据表概述
- 创建数据库以后,需要在其中创建数据表来存储数据,一个数据库中可以包含一张或多张表,表是数据的集合,是用来存储数据和操作数据的
- 数据在数据表中是按照行和列的格式来排列的
四:MySQL数据类型
数据类型可以更加方便管理和使用数据,它决定了存储数据的存储格式和有效范围
在MySQL数据库中,每一条数据都有其数据类型
MySQL的数据类型主要分为三大类:
1.数值类型(数值类型的字节数是固定的)
(1)整数数据类型
数据类型 | 取值范围 | 描述 | 所占字节数 |
---|---|---|---|
TINYINT | 有符号值:-128~127; 无符号值:0~255 | 最小的整数 | 1字节 |
SMALLINT | 有符号值:-32768~32767; 无符号值:0~65535 | 微小型整数 | 2字节 |
MEDIUMINT | 有符号值:-8388608~8388607; 无符号值:0~16777215 | 小型整数 | 3字节 |
INT(INTEGER) | 有符号值:-2147483648~2147483647; 无符号值:0~4294967295 | 中型整数 | 4字节 |
BIGINT | 有符号值:-9223372036854775808~9223372036854775807; 无符号值:0~18446744073709551615 | 大型整数 | 8字节 |
注意:
- 在整数类型后面加上
UNSIGNED
属性,表示声明的是无符号值,其取值从0开始 - 在整数类型后面加上
ZEROFILL
属性,表示在数值之前自动用0补充不足的位数;当使用ZEROFILL
属性修饰时,自动应用UNSIGNED
属性 - 在声明整数类型时,可以为它指定一个显示宽度(1~255),如果没有给它指定显示宽度,MySQL会给它指定一个默认值显示宽度,仅用于显示,并不会限制取值范围(如:
INT(5)
) - 数值类型的字节数是固定的,它的取值范围由其占用的字节数和编码方式(有符号/无符号)共同决定,字节数越多,数值取值范围越大
(2)浮点数数据类型
数据类型 | 取值范围 | 描述 | 精度 | 所占字节数 |
---|---|---|---|---|
FLOAT | 最小正规范数: 即 1.175494 × 10⁻³⁸ 最大正规范数: 即 3.402823 × 10³⁸ 最小正非规范数: 用于接近零的值 负数范围: 对称取反 | 单精度浮点数 | 约 6~7 位有效数字 | 4字节 |
DOUBLE | 最小正规范数: 即 2.225074 × 10⁻³⁰⁸ 最大正规范数: 即 1.797693 × 10³⁰⁸ 最小正非规范数: 用于接近零的值 负数范围: 对称取反 | 双精度浮点数 | 约 15~17 位有效数字 | 8字节 |
DEC(DECIMAL) | DECIMAL(M, N) 的取值范围由精度(即总位数) M 和小数位数(即小数点后的位数) N 决定 | 自定义精确数型 | 精确到定义的小数位 | 因精度位数而异 |
注意:
- 未指定精度时,默认
DECIMAL(10, 0)
DECIMAL
的存储空间由精度M
决定,每 9 位数字需要 4 字节,以此类推(每增加 9 位,增加 4 字节)- 在声明浮点数类型时,可以为它指定一个显示宽度指示器和一个小数点指示器(如:
FLOAT(5, 2)
5表示显示的值不超过5位数字;2表示小数点后有2位数字),存入的数据会自动被四舍五入 - 高精度会显著增加存储空间和计算开销,需根据业务需求选择: FLOAT:适合对内存敏感的场景(如大规模科学计算),但精度较低 DOUBLE:默认推荐类型,平衡了范围和精度,适合大多数工程计算 DECIMAL:需要精确小数时使用(如货币)
2.字符串类型
字符串类型可以用来存储任何一个值,MySQL中的字符串可以被单引号或双引号包裹
字符串类型分为三类:
(1)普通的文本字符串类型
数据类型 | 取值范围 | 描述 | 所占字节数 |
---|---|---|---|
CHAR(M) | 0~M个字符(M<=255) | 定长字符串,存储空间固定,适合存储长度相近的数据 | M x 3(在UTF-8中,1个中文字符占3个字节) |
VARCHAR(M) | 0~M个字符(M<=65535) | 变长字符串,长度可变,其它和char(M) 类似 | M x 3 + 长度标识(1/2字节) |
注意:
CHAR(M)
无论实际存储的字符数是否达到M
,均占用Mx字符集字节数
的空间VARCHAR(M)
仅占用实际的字符长度+长度标识
的空间- 在使用
CHAR
类型时,当实际传入的值的长度小于指定长度,会使用空格将实际长度填补至指定长度;而在使用VARCHAR
类型时,当实际传入的值的长度小于指定长度,那么实际长度即为传入字符串的长度,不会使用空格填补 - 在使用
CHAR
和VARCHAR
类型时,当实际传入的值的长度大于指定长度,字符串会被截取至指定长度 CHAR(M)
和VARCHAR(M)
表示可以存储M
个字符,注意不是M
个字节- 当数据分布不均时,使用
VARCHAR(M)
可大幅节省存储空间,变长类型的长度标识允许数据库动态计算实际占用空间并进行分配,可避免因固定长度导致数据溢出和存储空间的浪费 - 字符集对
CHAR
类型没有影响,因此CHAR(M)
中的M
最大为255;但是字符集对VARCHAR
类型是有影响的,如果使用的是UTF-8
字符集,每个字符大小为3字节,最大支持21845(65535/3=21845)个字符,因此VARCHAR(M)
中的M
最大为21845
(2)可变类型
数据类型 | 取值范围 | 描述 | 说明 |
---|---|---|---|
TINYBLOB | 0~255 字节(二进制数据) | 小BLOB 字段 | 存储短二进制数据(如:小型图标、加密密钥等) |
TINYTEXT | 0~255 字节(文本数据,字符数取决于编码) | 小文本串 | 存储短文本(如:简短描述、标签等)UTF-8 编码下字符数可能少于 255 |
BLOB | 0~65,535 字节(约 64KB) | 常规BLOB 字段 | 存储中等二进制数据(如:小图片、音频片段等) |
TEXT | 0~65,535 字节(约 64KB,字符数取决于编码) | 常规文本串 | 存储中等长度文本(如:文章摘要、评论等)UTF-8 编码下字符数可能少于 65,535 |
MEDIUMBLOB | 0~16,777,215 字节(约 16MB) | 中等BLOB 字段 | 存储较大二进制数据(如:高清图片、短视频片段等) |
MEDIUMTEXT | 0~16,777,215 字节(约 16MB,字符数取决于编码) | 中等文本串 | 存储较长文本(如:长文章、日志等)UTF-8 编码下字符数可能少于 16,777,215 |
LONGBLOB | 0~4,294,967,295 字节(约 4GB) | 长BLOB字段 | 存储大型二进制数据(如:完整视频、大型文件等) |
LONGTEXT | 0~4,294,967,295 字节(约 4GB,字符数取决于编码) | 长文本串 | 存储超长文本(如:书籍内容、详细报告等)UTF-8 编码下字符数可能少于 4,294,967,295 |
注意:
1. 关于二进制和文本类型:
- BLOB 系列(
TINYBLOB
、BLOB
、MEDIUMBLOB
、LONGBLOB
)用于存储二进制数据,支持任何数据(如图片、音频、视频等),字符集编码对BLOB
系列类型没有影响 - TEXT 系列(
TINYTEXT
、TEXT
、MEDIUMTEXT
、LONGTEXT
)用于存储文本数据(如文章、评论、日志等),TEXT系列类型实际字符数的取值范围受字符集编码影响
2. 性能与存储建议:
- 小数据:优先使用
TINYBLOB
/TINYTEXT
或BLOB
/TEXT
,以节省存储空间 - 大数据:对于超过 16MB 的数据(如高清视频),考虑使用
LONGBLOB
/LONGTEXT
,但需要注意数据库性能影响 - 替代方案:对于超大型文件(如 GB 级视频),建议存储文件路径而非文件本身,以避免数据库膨胀
(3)特殊类型
数据类型 | 最大值 | 描述 | 说明 | 所占字节数 |
---|---|---|---|---|
Enum("value1", "value2", ...) | 65535 | 从预定义的列表中选择单个值 | 适用于单选字段(如:订单状态;性别等) | 1~2 |
Set("value1", "value2", ...) | 64 | 从预定义的列表中选择0个或多个值 | 适用于多选字段(如:用户权限;兴趣等) | 1~8 |
3.日期/时间类型
数据类型 | 取值范围 | 说明 | 所占字节数 |
---|---|---|---|
DATE | 1000-01-01 ~ 9999-12-31 | 日期,格式为:YYYY-MM-DD | 3 |
TIME | -838:59:59 ~ 838:59:59 | 时间,格式为:HH:MM:SS | 3 |
DATETIME | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 日期和时间,格式为:YYYY-MM-DD HH:MM:SS | 8 |
TIMESTAMP | '1970-01-01' 00:00:00 ~ 2037年的某个时间 | 时间戳,格式为:YYYY-MM-DD HH:MM:SS | 4 |
YEAR | 1901 ~ 2155 | 年份,格式为:YYYY | 1 |
4.关于字符、字节和字符集
-
在不同的字符集下,字符占用的字节数不同;字符数也不同
-
字符;字节和字符集是计算机科学和信息技术中与文本处理密切相关的核心概念
(1)字符
-
字符是人类可识别的最小文本单元,也是与用户直接交互的文本单位(字母;数字;符号;汉字等都是字符)
-
字符具有抽象性,是逻辑概念,不直接对应计算机的存储方式,需通过字符集映射到二进制编码
(2)字节
-
字节(Byte)是计算机存储和传输数据的基本单位,也是计算机处理数据的物理单位,所有数据(包括字符)最终都以字节的形式存储在计算机中
-
1字节=8位二进制数(bit)
(3)字符集
-
字符集是字符与二进制编码(字节)之间的映射(翻译)规则,用于编码(将字符转换为字节序列)和解码(将字节序列还原为字符)
-
字符集是连接字符与字节的桥梁,决定了字符所占用的字节数和字符的存储效率
-
通过合理的选择字符集和优化编码方式可避免存储空间的浪费和乱码问题
-
编码格式是字符集的具体实现;字符集是众多字符的集合
5.数据类型的选择
(1)固定长度数据用 CHAR(速度快但可能浪费空间)
- 适用场景: 数据长度完全固定时(如身份证号、手机号、固定5位的邮编等)
- 优点: 存储和查询速度快,因为计算机直接通过固定位置读取,无需计算长度
- 缺点: 如果数据长度不足(如只存"M"),会用空格填充到指定长度,浪费存储空间
(2)可变长度数据用 VARCHAR(省空间但稍慢)
- 适用场景: 数据长度不固定时(如用户名、地址、电话号码)
- 优点: 只占用实际数据长度 + 1~2字节长度标识,不会浪费
- 缺点: 需要额外计算长度,查询速度略慢于
CHAR
(3)限定选项用 ENUM(只能选一个预设值)
- 适用场景: 数据必须从预设的固定选项中选择时(如订单状态:待支付、已支付、已取消;用户类型等)
- 优点: 强制数据规范(避免拼写错误或无效值);存储效率高(内部用整数索引存储)
- 缺点: 修改选项时需要改表结构
(4)多选项组合用 SET(可选多个预设值)
- 适用场景: 数据可以从多个预设选项中选一个或多个时(如用户兴趣:运动、音乐、阅读;商品标签)
- 优点: 能存储多个选项的组合(如"运动,音乐")
- 缺点: 选项数量有限(最多64个);修改选项同样需要改表结构
(5)不区分大小写搜索用 TEXT(适合长文本)
- 适用场景: 存储长文本(如文章内容、评论)且搜索时不区分大小写(如搜"hello"能匹配"Hello")
- 注意:
TEXT
类型本身默认不区分大小写,实际行为取决于数据库的排序规则
(6)区分大小写搜索用 BLOB(或二进制类型)
- 适用场景: 需要精确匹配大小写(如密码哈希、文件指纹)或存储二进制数据(如图片、音频)
- 优点: 严格区分大小写,适合需要精确匹配的场景
注意:
- 性能与空间的权衡:
CHAR
快但可能浪费空间,VARCHAR
省空间但稍慢 - ENUM/SET 的限制: 预设选项修改较麻烦(需改表结构),适合固定不变的选项
- TEXT/BLOB 的区别:
TEXT
用于文本,BLOB
用于二进制数据;搜索行为取决于数据库配置(如排序规则)
通过合理选择数据类型,既能保证数据准确性,又能提升存储效率和查询性能!