1.1数据类型分类
mysql 数据类型可以分为三大类:
- 数值类型:包括整数类型、浮点类型、定点类型等。
- 字符串类型:包括
char
、varchar
、text
等。 - 日期和时间类型:包括
date
、datetime
、timestamp
等。
1.2 数值类型
数值类型在 mysql 中主要有整型和小数型两种类型。
1.2.1 tinyint 类型
tinyint
类型是一个小的整数类型,通常用于存储小范围的整数。
范围:
- 有符号:-128 到 127
- 无符号:0 到 255
- 如果插入超出该范围的值,mysql 会报错。
示例:
create table tt1 (num tinyint); insert into tt1 values(1); -- 成功插入 insert into tt1 values(128); -- 报错,超出范围
有符号正数:
有符号负数:
无符号数:
1.2.2 bit 类型
bit
类型用于存储位字段,可以存储二进制数据。
示例:
create table tt4 (id int, a bit(8)); insert into tt4 values(10, 10); -- 存入10,显示可能是位二进制值
(bit[(m)] : 位字段类型。m表示每个值的位数,范围从1到64。如果m被忽略,默认为1。)
- 你可以定义存储的位数,例如
bit(8)
表示存储 8 位的二进制数。 - 默认情况下,
bit
类型在存储时会显示为 ascii 字符。
注:bit字段在显示时,是按照ascii码对应的值显示
1.2.3 小数类型
1.2.3.1 float 类型
float
类型用于存储浮动的小数值,支持四舍五入。
- 你可以通过
float(m, d)
来定义精度和小数位数,其中m
为总位数,d
为小数位数。
示例:
create table tt6 (id int, salary float(4, 2)); insert into tt6 values(100, -99.99); -- 成功插入 insert into tt6 values(101, -99.991); -- 会进行四舍五入,存储为 -99.99
案例:
小数:float(4,2)表示的范围是-99.99 ~ 99.99,mysql在保存值时会进行四舍五入。
如果是无符号数的float,其中的负数部分会被舍去。例如:
无符号小数:float(4,2)表示的范围是0 ~ 99.99,mysql在保存值时会进行四舍五入。
1.2.3.2 decimal 类型
decimal
类型是定点数,精度更高,适用于需要精确存储小数的情况。
decimal(m, d)
表示最多可以存储m
位数,其中d
位是小数部分。
示例:
create table tt7 (id int, salary decimal(5, 2)); insert into tt7 values(100, 99.99); -- 成功插入
注: decimal类型和float类型很像,他们都支持四舍五入,他们的无符号类型都是舍去负数,但是decimal类型的精度比float类型更高。
例如:
1.3 字符串类型
1.3.1 char 类型
char
是固定长度的字符串类型,适用于存储长度固定的字符串数据。
- 长度
l
最大为 255 字符。
示例:
create table tt9 (id int, name char(2)); insert into tt9 values(100, 'ab'); -- 成功插入 insert into tt9 values(101, '中国'); -- 成功插入
1.3.2 varchar 类型
varchar
是可变长度的字符串类型,适用于存储长度不固定的字符串数据。
- 最大长度是 65535 字节,实际存储的长度取决于字符集。
示例:
create table tt10 (id int, name varchar(6)); insert into tt10 values(100, 'hello'); -- 成功插入 insert into tt10 values(100, '我爱你,中国'); -- 成功插入
请思考为什么会出现这种情况?
原因是:char
和 varchar
类型在 mysql 中存储的是字符而非字节。在默认的 utf8
字符集下,每个字符通常占用 3 个字节。
由于 varchar
是可变长度的字符串类型,它不仅存储字符本身,还需要额外的空间来记录实际数据的长度。因此,在 utf8
编码下,varchar
字段的最大字符数是 21844。
这个限制是因为 varchar
的最大字节数为 65535 字节,而每个字符占用 3 个字节,再加上存储长度的开销(最多 3 个字节),因此实际能存储的最大字符数为 65535 / 3 = 21845
,减去存储长度所需的空间后,最终可以存储最多 21844 个字符。
1.3.3charvsvarchar
如何选择定长或变长字符串?
定长(char
):
如果数据的长度确定且不会变化,使用定长(char
)类型更为合适。例如:身份证、手机号、md5 值等。
变长(varchar
):
如果数据的长度有变化,可以使用变长(varchar
)类型。例如:名字、地址等数据。
优缺点对比:
定长(char
):
优点:
- 存储固定长度的数据时效率高。
- 因为空间已经预分配,查询时访问速度较快。
缺点:
- 存储短于定义长度的数据时会浪费空间。
- 例如,
char(10)
存储 3 个字符的数据时,会浪费 7 个字符的空间。
变长(varchar
):
优点:
- 根据实际字符长度分配空间,节省存储。
缺点:
- 需要动态计算长度,相比
char
稍慢。 - 在频繁查询或更新时,效率可能较低
1.4 日期和时间类型
常用的日期和时间类型:
- date:存储日期,格式为
'yyyy-mm-dd'
。 - datetime:存储日期和时间,格式为
'yyyy-mm-dd hh:ii:ss'
。 - timestamp:存储时间戳,从1970年1月1日开始计算。
1.5 enum 和 set 类型
1.5.1 enum 类型
enum
类型用于存储“单选”项。每个选项都有一个数字编号,对应存储在数据库中的实际值。
示例:
create table votes (username varchar(30), gender enum('男', '女')); insert into votes values('张三', '男');
enum里面的值默认下表从0开始,0表示空null
1.5.2 set 类型
set
类型用于存储“多选”项,可以选择多个值,值的组合会以数字标识。
示例:
create table votes (username varchar(30), hobby set('登山', '游泳', '篮球', '武术')); insert into votes values('雷锋', '登山,游泳');
爱好: | 爬山 | 登月 | 打球 | 游泳 | 睡觉 |
6 | 0 | 1 | 1 | 0 | 0 |
5 | 1 | 0 | 1 | 0 | 0 |
原因: set
类型中的值是按二进制位存储的,每个选项对应一个二进制位。每个选项的值会用一个数字表示,数字的每一位代表一个选项的状态(是否选中)。这样可以节省存储空间。
1.6 find_in_set函数
find_in_set(sub, str_list)
函数用于查找一个字符串是否在由逗号分隔的字符串列表中。
- 如果
sub
在str_list
中,返回其位置(下标)。 - 如果
sub
不在str_list
中,返回 0。
示例:
find_in_set('a', 'a,b,c')
返回 1,表示'a'
在'a,b,c'
中的第一个位置。find_in_set('d', 'a,b,c')
返回 0,表示'd'
不在'a,b,c'
中。
同时它可以让查找更方便
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论