• MySQL学习笔记9


    MySQL数据表中的数据类型:

    在考虑数据类型、长度、标度和精度时,一定要仔细地进行短期和长远的规划,另外,公司制度和希望用户用什么方式访问数据也是要考虑的因素。开发人员应该了解数据的本质,以及数据在数据库里是如何相互关联的,从而使用恰当的数据类型。

     create table的时候,应该花更多的时间和精力来设计表的结构,这样可以节省反复修改结构而浪费的时间。

    在创建表的时候,需要考虑一些基本问题:

    1)表里面包含什么类型的数据;

    2)表的名称是什么;

    3)哪些列可以作为主键;

    4)列字段的名称是什么;

    5)每个列的数据类型是什么?

    6)每个列的长度是什么?

    7)表里的哪些列可以为NULL?

    1. create table tb_user (
    2. id int not null auto_increment,
    3. username varchar(20),
    4. age tinyint unsigned,
    5. gender enum('male','female','secret'),
    6. address varchar(255),
    7. primary key(id)
    8. )engine=innodb default charset=utf8;

    经验之谈:一般情况下,我们在设计数据表时,必须拥有一个id主键字段,非空、自动编号、主键约束。

    select * from 数据表名 where 主键字段=主键的值,使用主键索引,可以加快查询数据。查询的效率非常明显。创建表的时候都会有一个类似id主键的字段。

    在创建数据表的时候,必须明确指定字段的名称和字段的数据类型。

    MySQL支持的数据类型:

    图片在数据库中存储的是图片的路径,就是一个字符串,就是字符型。

    数值类型:

    整数类型:(整数、精准)

     

    开发API接口通过JSON来编写的;5.7版本支持JSON的支持,对开发更友好一些。

    应用场景: 

    人的年龄和考试成绩都可以使用整数类型进行存储。

    整数类型的选型主要取决于数值的范围。在数据库设计原则,不是越大越好,而是正好满足条件即可。

    案例:设计一个数据表tb_student学生表(id, username, age, mobile)

    1. create table tb_student (
    2. id mediumint unsigned not null auto_increment,
    3. username varchar(20),
    4. age tinyint unsigned,
    5. mobile char(11),
    6. primary key(id)
    7. )engine=innodb default charset=utf8;
    8. mysql> desc tb_student;
    9. +----------+-----------------------+------+-----+---------+----------------+
    10. | Field | Type | Null | Key | Default | Extra |
    11. +----------+-----------------------+------+-----+---------+----------------+
    12. | id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment |
    13. | username | varchar(20) | YES | | NULL | |
    14. | age | tinyint(3) unsigned | YES | | NULL | |
    15. | mobile | char(11) | YES | | NULL | |
    16. +----------+-----------------------+------+-----+---------+----------------+
    17. 4 rows in set (0.00 sec)
    18. mysql>
    19. mysql> show create table tb_student;
    20. +------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    21. | Table | Create Table |
    22. +------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    23. | tb_student | CREATE TABLE `tb_student` (
    24. `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
    25. `username` varchar(20) DEFAULT NULL,
    26. `age` tinyint(3) unsigned DEFAULT NULL,
    27. `mobile` char(11) DEFAULT NULL,
    28. PRIMARY KEY (`id`)
    29. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    30. +------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    31. 1 row in set (0.00 sec)

    小数类型:

    浮点类型(近似值)

    FLOAT和DOUBLE: 都是近似数字数据值,MySQL对于单精度值使用四个字节,对于双精度使用8个字节,FLOAT单精度浮点数值精确到越7位小数,DOUBLE双精度浮点数精确到大约15位小数,FLOAT类型会随着数值的增大精度会减少。

    例如人的身高信息,我们用一个float类型就可以了。超过它的极限的时候才回出现失真。

    举例说明

    FLOAT(M,D),其中,M表示存储的有效位数,D代表小数点后面的位数;即整数位数+小数部分不能超过M值。 colum1 FLOAT(7,4) 上面例子中,如果你插入为999.00009到cloum1列,那么mysql在存储时会四舍五入变为999.0001插入。

    DOUBLE(7,4) :DOUBLE类型的使用与FLOAT类型完全一致,唯一的区别就是占用字节不同且浮点数的精度有所不同。

    定点类型:

    DECIMAL和NUMERIC

    `DECIMAL`和`NUMERIC` 类型的存储==精确的数值数据==。使用这些类型时,重要的是要保留==精确的精度==,例如使用**货币数据**。在MySQL中, `NUMERIC`被作为`DECIMAL`来应用,所以下面的举例`DECIMAL`同样适用于 `NUMERIC` 。

    没有精度的损失。

    decimal:小数的。精确的精度。

    salary DECIMAL(5,2)
    在上面的例子中,薪水字段的类型为decimal,表示精确的数字。其中,5代表精度,2代表刻度。
    精度表示数值存储的有效位数,刻度表示小数点后面可存储的位数。
    DECIMAL(5,2)能够存储五位数和两位小数的任何值,因此可以存储在salary 列中的值的范围-999.99是 999.99(有符号)

    特殊注意:
    DECIMAL(M)和DECIMAL(M,0)是相等的,存储长度取决于M的值,默认情况下M值为10.刻度为0表示没有小数。

    案例:定义一个职员表tb_staff,定义字段(id、username、salary、addtime)

    1. mysql> create table tb_staff (
    2. -> id tinyint unsigned not null auto_increment,
    3. -> username varchar(20),
    4. -> salary decimal(10,2),
    5. -> addtime date,
    6. -> primary key(id)
    7. -> )engine=innodb default charset=utf8;
    8. Query OK, 0 rows affected (0.00 sec)
    9. mysql> desc tb_staff;
    10. +----------+---------------------+------+-----+---------+----------------+
    11. | Field | Type | Null | Key | Default | Extra |
    12. +----------+---------------------+------+-----+---------+----------------+
    13. | id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment |
    14. | username | varchar(20) | YES | | NULL | |
    15. | salary | decimal(10,2) | YES | | NULL | |
    16. | addtime | date | YES | | NULL | |
    17. +----------+---------------------+------+-----+---------+----------------+
    18. 4 rows in set (0.00 sec)
    19. mysql> insert into tb_staff values(null,'libo', 20001.35,'2020-10-01');
    20. Query OK, 1 row affected (0.01 sec)
    21. mysql>
    22. mysql> select * from tb_staff;
    23. +----+----------+----------+------------+
    24. | id | username | salary | addtime |
    25. +----+----------+----------+------------+
    26. | 1 | libo | 20001.35 | 2020-10-01 |
    27. +----+----------+----------+------------+
    28. 1 row in set (0.00 sec)
  • 相关阅读:
    JS总结篇
    java高级编程day20【谷】
    ROS1云课→27机器人SLAM小结
    直播带货代运营公司9人被抓
    java文件传输简单方法
    安卓在Fragment控制状态栏显示隐藏
    Unity 向量
    Linux安装Redis数据库,无需公网IP实现远程连接
    【linux】shell脚本调试
    【万字详解】JavaScript算法 | 力扣经典题~收藏起来,面试用得上
  • 原文地址:https://blog.csdn.net/chang_chunhua/article/details/133219828