5:数据类型-MySQL

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 5:数据类型-MySQL

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 布尔类型

总的讲就是true1false0

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)


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
关系型数据库 MySQL 数据库
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
MySQL数据库基础(数据库操作,常用数据类型,表的操作)
44 5
|
2月前
|
存储 关系型数据库 MySQL
MySQL支持多种数据类型
MySQL支持多种数据类型
135 3
|
2月前
|
存储 关系型数据库 MySQL
什么是mysql的数据类型?
什么是mysql的数据类型?
51 2
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据类型
MySQL数据类型
60 2
|
4月前
|
关系型数据库 MySQL Linux
数据类型和运算符(MySQL服务器的安装,MySQL客户端,数据类型,运算符,MySQL的语法规范)
无论是对于初学者还是有经验的开发者,了解MySQL的安装、客户端使用、数据类型、运算符和语法规范都是至关重要的。这不仅有助于高效地管理和查询数据,而且对于设计和实现数据库解决方案来说是基础工作。通过深入学习和实践这些知识,您可以更好地发挥MySQL数据库的强大功能。
37 2
|
4月前
|
存储 关系型数据库 MySQL
MySQL 中的 BLOB 数据类型深入解析
【8月更文挑战第31天】
582 0
|
4月前
|
存储 关系型数据库 MySQL
|
4月前
|
存储 XML 关系型数据库
深入理解MySQL中的BLOB和TEXT数据类型
【8月更文挑战第31天】
729 0
|
4月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
514 0
|
5月前
|
存储 SQL 关系型数据库
MySQL设计规约问题之存储状态、性别等信息时,应该使用哪种数据类型
MySQL设计规约问题之存储状态、性别等信息时,应该使用哪种数据类型