【MySQL】数据类型

目录

🌈前言🌈

[📁 数据类型分类](#📁 数据类型分类)

[📁 数值类型](#📁 数值类型)

[📂 tinyint类型](#📂 tinyint类型)

[📂 bit类型](#📂 bit类型)

[📂 float类型](#📂 float类型)

[📂 decimal类型](#📂 decimal类型)

[📁 时间类型](#📁 时间类型)

[📁 字符类型](#📁 字符类型)

[📂 char](#📂 char)

[📂 varchar](#📂 varchar)

[📂char 和 varchar的区别](#📂char 和 varchar的区别)

[📂 enum和set](#📂 enum和set)

[📁 总结](#📁 总结)


🌈前言🌈

本期【MySQL】主要讲解MySQL中数据类型有哪些,主要讲解数值类型,时间类型,字符类型。

📁 数据类型分类

红色内容是我们本期内容主要讲解内容。

📁 数值类型

📂 tinyint类型

sql 复制代码
create table tt1(num tinyint);

insert into tt1 values(1); -- 插入成功

insert into tt1 values(128); -- 越界插入,报错
ERROR 1264 (22003): Out of range value for column 'num' at row 1

tinyint可以指定有符号和无符号类型,默认是有符号的。可以哦太难过unsigned来说明某个字段是无符号的。

sql 复制代码
create table tt2(num tinyint unsigned);
insert into tt2 values(-1); -- 无符号,范围是: 0 - 255
ERROR 1264 (22003): Out of range value for column 'num' at row 1

tinyint,int,bigint只不过是取值范围的区别,根据自己的需要选择相应的类型即可。

📂 bit类型

sql 复制代码
bit(M): 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。

create table tt4 ( id int, a bit(8));
insert into tt4 values(10, 10);

bit字段在显示时,是按照ASCII码对应的值显示。

如果我们想要存放0和1,就可以定义bit(1)。

📂 float类型

sql 复制代码
float(m, d) [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。

sql 复制代码
mysql> create table tt6(id int, salary float(4,2));

mysql> insert into tt6 values(100, -99.99);

mysql> insert into tt6 values(101, -99.991); #多的这一点被拿掉了

mysql> select * from tt6;
+------+--------+
| id | salary |
+------+--------+
| 100 | -99.99 |
| 101 | -99.99 |
+------+--------+
2 rows in set (0.00 sec)

如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99,直接砍去负数部分。

📂 decimal类型

sql 复制代码
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

decimal和float的区别就是表示精度不同,float的精度大约是7位,decimal整数最大位数m为65,支持小数最大位数是30。如果d被省略,默认为0,m被省略,默认是10。

如果希望小数的精度高,就是用decimal。

📁 时间类型

sql 复制代码
date: 日期 'yyyy-mm-dd' ,占用三字节

datetime: 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从1000到9999,占用八字节

timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和datetime 完全一致,占用
四字节

timestamp 和 datatime的区别就是,timestamp会在更新或修改该行时,会自动更新时间,二datatime不会。

📁 字符类型

📂 char

sql 复制代码
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

L表示存储的长度,单位是字符,不是字节,因此不管是中文还是英文或是其他,都是两个字符。

char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255

sql 复制代码
mysql> create table tt9(id int, name char(2));

mysql> insert into tt9 values(100, 'ab');

mysql> insert into tt9 values(101, '中国');

mysql> select * from tt9;
+------+--------+
| id | name |
+------+--------+
| 100 | ab |
| 101 | 中国 |
+------+--------+

📂 varchar

sql 复制代码
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

varchar和char在使用上没有任何区别,只不过char是固定长度,varchar是可变长度。

sql 复制代码
mysql> create table tt10(id int ,name varchar(6)); --表示这里可以存放6个字符
mysql> insert into tt10 values(100, 'hello');
mysql> insert into tt10 values(100, '我爱你,中国');
mysql> select * from tt10;
+------+--------------------+
| id | name |
+------+--------------------+
| 100 | hello |
| 100 | 我爱你,中国 |
+------+--------------------+

varcahr的最大长度取决于 MySQL 的存储引擎和字符集。一般情况下,varchar类型的最大长度为 65,535 字符。这个限制包括数据长度和额外的存储开销(例如长度信息),所以实际存储的字符数可能会少于 65,535。

📂char 和 varchar的区别

如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5

如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。定长的磁盘空间比较浪费,但是效率高。

变长的磁盘空间比较节省,但是效率低。

定长的意义是,直接开辟好对应的空间。

变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

📂 enum和set

sql 复制代码
enum:枚举,"单选"类型;
enum('选项1','选项2','选项3',...);

set:集合,"多选"类型;
set('选项值1','选项值2','选项值3', ...);

enum 只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是"数字"(下标),因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

set 只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是"数字"(位图),因为这些选项的每个选项值依次对应如下数字:1,2,3...最多64个。

sql 复制代码
mysql> create table votes(
-> username varchar(30),
-> hobby set('登山','游泳','篮球','武术'), --注意:使用数字标识每个爱好的时候,
                              --采用比特位位置来和set中的爱好对应起来
-> gender enum('男','女')); --注意:使用数字标识的时候,就是正常的数组下标

插入数据:

sql 复制代码
insert into votes values('雷锋', '登山,武术', '男');
insert into votes values('Juse','登山,武术',2);
select * from votes where gender=2;
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| Juse | 登山,武术 |女 |
+----------+---------------+--------+

数据如下:

sql 复制代码
+-----------+---------------+--------+
| username | hobby | gender |
+-----------+---------------+--------+
| 雷锋 | 登山,武术 | 男 |
| Juse | 登山,武术 | 女 |
| LiLei | 登山 | 男 |
| LiLei | 篮球 | 男 |
| HanMeiMei | 游泳 | 女 |
+-----------+---------------+--------+

如果我们想要查找hobby中只有登山的行,可以通过select选择:

sql 复制代码
mysql> select * from votes where hobby='登山';
+----------+--------+--------+
| username | hobby | gender |
+----------+--------+--------+
| LiLei | 登山 | 男 |
+----------+--------+--------+

如果我们想要查找hobby中有登山的行,可以通过find_ in_ set函数:

sql 复制代码
mysql> select * from votes where find_in_set('登山', hobby);
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| 雷锋 | 登山,武术 | 男 |
| Juse | 登山,武术 | 女 |
| LiLei | 登山 | 男 |
+----------+---------------+--------+

📁 总结

以上就是本期【MySQL】的主要内容了,主要讲解MySQL中主要的数据类型,如何使用这些数据类型。

如果感觉本期内容对你有帮助,欢迎点赞,关注,收藏Thanks♪(・ω・)ノ

相关推荐
qq_529835351 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
Nerd Nirvana2 小时前
软考—系统架构设计(案例 | 论文)
linux·系统架构·软件工程·软考·计算机基础
勤奋的凯尔森同学3 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
月光水岸New3 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6753 小时前
数据库基础1
数据库
我爱松子鱼3 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo4 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser5 小时前
【SQL】多表查询案例
数据库·sql
Galeoto5 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)5 小时前
MySQL主从架构
服务器·数据库·mysql