1.数据类型总体介绍
所谓的数据类型:对数据进行统一的分类。从系统的角度出发,是为了使用统一的方式进行管理,更好的利用有限的空间。SQL中将数据类型分了三大类:数值类型、字符串类型和时间日期类型
2.tinyint
1.tinyint -> 中文意思,非常小的整数,这个整数占一个字节,表示的范围为 -128~127
2.一般插入数据时,即是超过了范围,也不会报错,只是会发生截断,因此需要在/etc/my.cnt中的mysqld标签下增加 sql_mode=‘STRICT_ALL_TABLES’,增强数据库对插入范围的校验,设置之后重启数据库
3.如果在设计数据库表字段的时候,设计到整形数据,尽量不要使用tinyint,而是用表示范围更大的类型,发展性眼观,为后续预留
4.对于整形数据,尽量少用unsigned,因为一个小的数字减去一个大的数字,有可能会导致查询结果出错,因此无符号表示不了负数
2.BIT类型
1.BIT类型的值是按照ASCII码来表示的
2.如果只想存储0或者1,则BIT类型的比特位数设置称为1
3.小数类型
1.type(m,d):m指定长度,d指定小数点后的位数
2.float占用4字节
3.double占用8字节,比float精度更高
4.decimal,精度更高
4.字符类型
1.char(L):固定长度的字符串,L不是占用字节的大小,而是字符串的长度;字符占用字节的数量和数据库的编码格式息息相关;
比如:LATIN1:1个字符占用1个字节,utf8:1个字符占用3个字节
比如在utf8格式下,char(10)占用的字节数为 3*10=30字节
2.varchar(L):可变长度的字符串,L表示字符长度;到底可以存储多少个字符,和数据库的编码息息相关;
理论上的长度为65535个字符,如果编码格式表示的字符是用n个字节来表示的,那么字符串的理论长度为(65535-(1~3))/n。比如在utf8格式下,最大长度为 (65535-3)/3=21844
3.固定长度字符串和可变长度字符串区别:
1.对于char而言,定义之后就开辟好了空间,对varchar而言,在定义的范围之内,存储多少字符串,就开辟多大的空间
2.varchar不可以超过设定的长度L
3.varchar类型需要用到1-3个字节来保存字符串的长度,
//创建数据库,字符集设置为utf8
MariaDB [(none)]> create database test4 charset= utf8;
Query OK, 1 row affected (0.00 sec)
//创建一个数据表,设置两个列,类型分别为char 和 varchar
MariaDB [test4]> create table t1 (name1 char(6),name2 varchar(6));
Query OK, 0 rows affected (0.01 sec)
//此时,char用了3*4=12字节,定义的时候就开辟好了
//varchar,使用的字节数为3*3=9字节,动态开辟的
MariaDB [test4]> insert into t1 values(123,123);
Query OK, 1 row affected (0.00 sec)
//下列代码验证了,两者皆不可超过设定的长度
MariaDB [test4]> insert into t1 values(1234567,123);
ERROR 1406 (22001): Data too long for column 'name1' at row 1
MariaDB [test4]> insert into t1 values(123,1234567);
ERROR 1406 (22001): Data too long for column 'name2' at row 1
如何选择定长或变长字符串?
如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号
如果数据长度有变化,就使用变长(varchar),比如:名字,地址,但是你要保证最长的能存的进去。
定长的磁盘空间比较浪费,但是效率高。变长的磁盘空间比较节省,但是效率低。
5.日期和时间类型
1.datetime:时间日期类型,YYY-MMM-DDD HH:mm:SS。这个类型需要操作者手动插入时间
2.date类型只表示年月日,占用三个字节
3.timestamp:时间戳类型,从1970年开始,表示的年月日,时分秒 YYY-MMM-DDD HH:mm:SS。这个可以自己计算当中的时间
//timestamp可以自动生成时间
MariaDB [test4]> create table t3(name char(8),DTtime datetime,DAtime date,DPtime timestamp);
Query OK, 0 rows affected (0.00 sec)
MariaDB [test4]> insert into t3 (name) values("李四");
Query OK, 1 row affected (0.00 sec)
MariaDB [test4]> select * from t3;
+--------+--------+--------+---------------------+
| name | DTtime | DAtime | DPtime |
+--------+--------+--------+---------------------+
| 李四 | NULL | NULL | 2021-06-29 19:26:00 |
+--------+--------+--------+---------------------+
//手动插入时间
MariaDB [test4]> insert into t3 values('李四','2021-06-29 19:27:00','2021-06-29','2021-06-29 19:27:00');
Query OK, 1 row affected (0.00 sec)
MariaDB [test4]> select * from t3;
+--------+---------------------+------------+---------------------+
| name | DTtime | DAtime | DPtime |
+--------+---------------------+------------+---------------------+
| 李四 | NULL | NULL | 2021-06-29 19:26:00 |
| 李四 | 2021-06-29 19:27:00 | 2021-06-29 | 2021-06-29 19:27:00 |
+--------+---------------------+------------+---------------------+
6.enum、set
1.enum:
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是"数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3….最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。
枚举了很多值,但是只能在其中选择一个,如果插入的值不再枚举列表之中,就会报错
2.set:
该设定只是提供了若干个选项的值,最终一个单元格中,可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是"数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3….最多64个。
列举出来了很多值,可以在其中选择多个值,进行组合,插入的值不在其中,就会报错
//创建表
MariaDB [test4]> create table t9(name char(10),fruit set('香蕉','菠萝','哈密瓜'),sex enum('男','女'));
//汉字插入
MariaDB [test4]> insert into t9 values('张三','菠萝,哈密瓜','男');
//用序号插入
MariaDB [test4]> insert into t9 values('小红','1','2');
MariaDB [test4]> select * from t9;
+--------+------------------+------+
| name | fruit | sex |
+--------+------------------+------+
| 张三 | 菠萝,哈密瓜 | 男 |
| 小红 | 香蕉 | 女 |
+--------+------------------+------+
集合查询使用find_in_set函数
MariaDB [test4]> select * from t9;
+--------+------------------+------+
| name | fruit | sex |
+--------+------------------+------+
| 张三 | 菠萝,哈密瓜 | 男 |
| 小红 | 香蕉 | 女 |
+--------+------------------+------+
//在展示的集合之中,寻找'菠萝'
MariaDB [test4]> select *from t9 where find_in_set('菠萝',fruit);
+--------+------------------+------+
| name | fruit | sex |
+--------+------------------+------+
| 张三 | 菠萝,哈密瓜 | 男 |
+--------+------------------+------+
//展示的集合为表t9的名字列和水果列,并且从中寻找'菠萝',where相当于衔接
MariaDB [test4]> select name,fruit from t9 where find_in_set('菠萝',fruit);
+--------+------------------+
| name | fruit |
+--------+------------------+
| 张三 | 菠萝,哈密瓜 |
+--------+------------------+