5.1 数据库的数据类型问题
企业中的数据类型定义没有统一的标准,每一个公司会根据自己的产品需要和需求来定制属于自己的数据类型
5.2 int数值类型
在企业中要使用到整型的地方会特别的多,但是十分值得注意的是,数据库和我们的编程不太一样,它会更加的珍惜字节空间
所以在定义数据库的数据类型前,需要考虑所定义字段的大小和所定义字段的实际使用(有无符号)是什么样的
MySQL的各种数据类型的范围大小可以上网查询, 例如无符号整型,范围是(-128,127)
age tinyint unsigned comment'年龄'
5.3 int类型实际操作和注意事项
mysql> create table emp( -> id smallint unsigned auto_increment primary key comment'id', -> age tinyint unsigned , -> kkk int(6) -> ); Query OK, 0 rows affected (0.03 sec) mysql> show tables; +-------------------+ | Tables_in_student | +-------------------+ | emp | | teacher | +-------------------+ 2 rows in set (0.00 sec) mysql> desc emp -> ; +-------+----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------------------+------+-----+---------+----------------+ | id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | age | tinyint(3) unsigned | YES | | NULL | | | kkk | int(6) | YES | | NULL | | +-------+----------------------+------+-----+---------+----------------+ 3 rows in set (0.01 sec)
mysql> insert into emp values(null,128,99999999); Query OK, 1 row affected (0.00 sec) mysql> select * from emp; +----+------+----------+ | id | age | kkk | +----+------+----------+ | 1 | 128 | 99999999 | +----+------+----------+ 1 row in set (0.00 sec)
注意:在desc cat
表的时候,数据类型后面有宽度的限制,宽度限制是可以超过的,但是不能超过所定义数据类型值的范围
5.4 浮点数类型
在企业中一般不会要求使用浮点型,容易丢失精度,只在特殊的要求下使用浮点类型的
丢失精度是指,float
占用32bit,其中24bit用于表示有效数字,只能表示6-7位有效数字
create 表名 字段名 浮点类型(最大长度位m,小数位d)
注意:最大长度位要大于小数位,超过的小数位会四舍五入,至于存储范围取决于是否定义了无符号,从(0.0 ,99999.9)或 (99999.9,99999.9),默认大小为24位数字,精度为6位
mysql> create table t_1( -> number_1 float(3,1), -> number_2 double(5,2) -> ); Query OK, 0 rows affected (0.02 sec) mysql> desc t_1; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | number_1 | float(3,1) | YES | | NULL | | | number_2 | double(5,2) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> insert into t_1 values(2.1,2.23); Query OK, 1 row affected (0.00 sec) mysql> select * from t_1; +----------+----------+ | number_1 | number_2 | +----------+----------+ | 2.1 | 2.23 | +----------+----------+ 1 row in set (0.00 sec)
四舍五入
mysql> insert into t_1 values(2.9,2.77777777); Query OK, 1 row affected (0.01 sec) mysql> select * from t_1; +----------+----------+ | number_1 | number_2 | +----------+----------+ | 2.1 | 2.23 | | 2.9 | 2.78 | +----------+----------+ 2 rows in set (0.00 sec)
mysql> insert into t_1 values(2.99,2.99999999999999999999999999999999999); Query OK, 1 row affected (0.00 sec) mysql> select * from t_1; +----------+----------+ | number_1 | number_2 | +----------+----------+ | 2.1 | 2.23 | | 2.9 | 2.78 | | 3.0 | 3.00 | +----------+----------+ 3 rows in set (0.00 sec)
mysql> insert into t_2 values(9.1111111111111111111111111111111); Query OK, 1 row affected (0.01 sec) mysql> select * from t_2; +-----------------------+ | number | +-----------------------+ | 9.1111111111111100000 | +-----------------------+ 1 row in set (0.00 sec)
可以看到精度丢失是十分严重的,所以在对钱的数据管理时候不能使用浮点数,如何解决这个问题呢?这就要用到定点数
5.5 定点数类型
定点数不会丢失精度,因为它的整数和小数分开存储管理,在生活中有许多的小数要求的精度非常之高,所以需要使用定点数
mysql> create table t_3( -> number decimal(20,19) -> ); Query OK, 0 rows affected (0.02 sec) mysql> desc t_3; +--------+----------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+----------------+------+-----+---------+-------+ | number | decimal(20,19) | YES | | NULL | | +--------+----------------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> insert into t_3 values(8.111111111111111111111); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select * from t_3; +-----------------------+ | number | +-----------------------+ | 8.1111111111111111111 | +-----------------------+ 1 row in set (0.00 sec)
5.6 字符串与文本类型
在字符类型中比较常用的是varchar
(变长)类型,与之相对应的是char
(定长)类型
当然varcahr
的使用会比较的多,最主要优势就是它会自动回收多余的字符空间,但是它相对于char
的效率也会更低
对于长篇的博客和论文使用字符类型肯定是无法进行存储的,所以在数据库中有一个专门存储文本的数据类型,例如text
5.7 布尔类型
总的讲就是true
是1
,false
是0
mysql> create table t_4( -> boool boolean -> ); Query OK, 0 rows affected (0.02 sec) mysql> insert into t_4 values(true); Query OK, 1 row affected (0.01 sec) mysql> select * from t_4; +-------+ | boool | +-------+ | 1 | +-------+ 1 row in set (0.00 sec) mysql>
5.8 枚举类型
facebook有一大堆性别选项是怎么实现的?
我们国内多的社交网站对性别的选项一般都会有三个:男、女、保密
生活中很多数据是,是大于两种选择的类别,对这种数据类型的定义使用枚举类型(enum
)
mysql> create table t_5( -> gender enum('man', 'woman', '?', 'nothing', 'it') -> ); Query OK, 0 rows affected (0.02 sec) mysql> desc t_5; +--------+----------------------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+----------------------------------------+------+-----+---------+-------+ | gender | enum('man','woman','?','nothing','it') | YES | | NULL | | +--------+----------------------------------------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> insert into t_5 values('man'); Query OK, 1 row affected (0.00 sec) mysql> insert into t_5 values('123'); ERROR 1265 (01000): Data truncated for column 'gender' at row 1 mysql> select * from t_5; +--------+ | gender | +--------+ | man | +--------+ 1 row in set (0.00 sec) mysql>
5.9 枚举类型的另类存储方式
枚举不太一样的存储方式
语法:字段名 enum('选择1','选择2','选择3'...)
mysql> insert into t_5 values(2); Query OK, 1 row affected (0.00 sec) mysql> select * from t_5; +--------+ | gender | +--------+ | man | | woman | +--------+ 2 rows in set (0.00 sec)
注意:枚举类型选项的存储非常节省空间,它对选项的的管理使用整数,选择1,对应的整数就是1,选择2,对应的整数就是2…以此类推
5.10 枚举类型的好处,为何要用枚举类型,企业可能用在哪?
使用枚举类型可以方便我们解决某些需求外,速度很快又节省很多空间
5.11 set类型
如果说枚举是做单选题,那set
就是做多选题
生活中还有许多的数据是在限定范围内可以做多个选项的,这个时候就要用set
类型,set
是使用2的n次方来存储的
mysql> desc t_6; +-------+--------------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------------------+------+-----+---------+-------+ | hobby | set('A','B','C','D','E') | YES | | NULL | | +-------+--------------------------+------+-----+---------+-------+ 1 row in set (0.00 sec) 'inset into t_6 values('A,B,C')' at line 1 mysql> insert into t_6 values('A,B,C'); Query OK, 1 row affected (0.00 sec) mysql> select * from t_6; +-------+ | hobby | +-------+ | A,B,C | +-------+ 1 row in set (0.00 sec) mysql> insert into t_6 values('C,B,E'); Query OK, 1 row affected (0.01 sec) mysql> select * from t_6; +-------+ | hobby | +-------+ | A,B,C | | B,C,E | +-------+ 2 rows in set (0.00 sec)
5.12 时间日期类型
基本上使用的是datetime
,这是每个表必须有的数据,记录表的各种操作的时间,这个一般也不会手动输入,都是在编程的时候会自动获取时间
mysql> create table t_7( -> createdTime datetime -> ); Query OK, 0 rows affected (0.02 sec) mysql> desc t_7; +-------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------+------+-----+---------+-------+ | createdTime | datetime | YES | | NULL | | +-------------+----------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> insert into t_7 values('2021-09-17 01:28:00'); Query OK, 1 row affected (0.00 sec) mysql> select * from t_7; +---------------------+ | createdTime | +---------------------+ | 2021-09-17 01:28:00 | +---------------------+ 1 row in set (0.00 sec)