当前位置:   article > 正文

Database & Data Type ——MySQL_mysql的datatype

mysql的datatype

 MySQL 支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。

1.数值类型

        严格数值数据类型:INTEGER、SMALLINT、DECIMAL、NUMERIC

        近似数值数据类型:FLOAT、REAL、DOUBLE PRECISION

        无符号类型为在原类型后加上 unsigned。e.g. INT UNSIGNED

        1⃣️整型数 

  1. //下给出一个表的结构:
  2. +-------+----------------------+------+-----+---------+----------------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +-------+----------------------+------+-----+---------+----------------+
  5. | id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
  6. | age | tinyint(3) unsigned | YES | | NULL | |
  7. | salary| int(6) | YES | | NULL | |
  8. +-------+----------------------+------+-----+---------+----------------+
  9. //不难发现,以tinyint(3)为例,括号中的内容是当前字段的宽度,而非大小。tinyint大小为1Byte,宽度为3.

注意:在desc cat表的时候,数据类型后面有宽度的限制,宽度限制是可以超过的,但是不能超过所定义数据类型值的范围

        2⃣️浮点数

  1. //创建字段时的格式:
  2. 字段名 浮点类型(最大长度位m,小数位d)

注意:若输入的位数超过了设定的小数位则会四舍五入;存储范围取决于浮点类型及有无符号。

 e.g.

  1. //创建数据表:
  2. mysql> create table t_1(
  3. -> number_1 float(3,1),
  4. -> number_2 double(5,2)
  5. -> );
  6. //表结构如下:
  7. mysql> desc t_1;
  8. +----------+-------------+------+-----+---------+-------+
  9. | Field | Type | Null | Key | Default | Extra |
  10. +----------+-------------+------+-----+---------+-------+
  11. | number_1 | float(3,1) | YES | | NULL | |
  12. | number_2 | double(5,2) | YES | | NULL | |
  13. +----------+-------------+------+-----+---------+-------+
  14. 2 rows in set (0.00 sec)
  15. //插入数据:
  16. mysql> insert into t_1 values(2.9,2.77777777);
  17. //表中数据如下:输入的位数超过了设定的小数位,进行了四舍五入。
  18. mysql> select * from t_1;
  19. +----------+----------+
  20. | number_1 | number_2 |
  21. +----------+----------+
  22. | 2.9 | 2.78 |
  23. +----------+----------+
  24. 2 rows in set (0.00 sec)

丢失精度:

        以float为例float占用4Byte,其中3Byte用于表示有效数字,只能表示6-7 bit有效数字。

        

 e.g.

  1. //创建数据表:
  2. mysql> create table t_2(
  3. -> number double(20,19)
  4. -> );
  5. //表结构如下:
  6. mysql> desc t_2;
  7. +---------+--------------+------+-----+---------+-------+
  8. | Field | Type | Null | Key | Default | Extra |
  9. +----------+-------------+------+-----+---------+-------+
  10. | number | double(20,19)| YES | | NULL | |
  11. +---------+--------------+------+-----+---------+-------+
  12. 1 rows in set (0.00 sec)
  13. //输入数据:
  14. mysql> insert into t_2 values(9.1111111111111111111111111111111);
  15. //查看表中数据:发现精度丢失,有效位数中小数位数比规定的小数位少!
  16. mysql> select * from t_2;
  17. +-----------------------+
  18. | number |
  19. +-----------------------+
  20. | 9.1111111111111100000 |
  21. +-----------------------+
  22. 1 row in set (0.00 sec)

因此,对于关键数据,一般不会要求使用浮点型,只在特殊要求下使用浮点类型。

3⃣️ 定点型

  1. //创建字段时的格式:
  2. 字段名 定点类型(最大长度位m,小数位d)

        定点数不会丢失精度,因为它的整数和小数分开存储管理,在生活中有许多的小数要求的精度非常之高,所以需要使用定点数。

  1. //创建数据表:
  2. mysql> create table t_3(
  3. -> number decimal(20,19)
  4. -> );
  5. //表结构如下:
  6. mysql> desc t_3;
  7. +--------+----------------+------+-----+---------+-------+
  8. | Field | Type | Null | Key | Default | Extra |
  9. +--------+----------------+------+-----+---------+-------+
  10. | number | decimal(20,19) | YES | | NULL | |
  11. +--------+----------------+------+-----+---------+-------+
  12. 1 row in set (0.00 sec)
  13. //输入数据:
  14. mysql> insert into t_3 values(8.111111111111111111111);
  15. //查看表中数据:无精度丢失
  16. mysql> select * from t_3;
  17. +-----------------------+
  18. | number |
  19. +-----------------------+
  20. | 8.1111111111111111111 |
  21. +-----------------------+
  22. 1 row in set (0.00 sec)

2.字符串类型

​​​​​​​​​​​​​​

        应用中使用较多的为varchar(变长)类型、char(定长)类型。varchar类型会自动回收多余的字符空间,但相对于char的效率也会更低。

         char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符。

        MySQL中提供专门存储文本的数据类型TEXT:TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

3.布尔类型 boolean

        输入为true则对应的是1false则0。

4.枚举类型 menu

  1. //创建字段时的格式:
  2. 字段名 enum(选项1,选项2,......)

        只能够输入枚举类型中存在的数据值,否则会报错。

        枚举类型在计算机底层的管理方式:按照创建时的数据,对其进行编号:第一个选项为1,第二个为2......此方式极大的节约了存储空间。

        因此,在输入数据时,枚举类型字段对应的数据可以直接输入数字1/2/3....

5.set类型

        和menu类似,但set类型可以选择多个选项。

  1. //创建字段时的格式:
  2. 字段名 set(选项1,选项2,......)
  1. //在输入数据时,若想要输入多个选项:
  2. insert into 表名 values('选项1,选项2,选项3...');
  3. //错误写法如下:
  4. insert into 表名 values('选项1','选项2','选项3',...);
  5. //此写法是错误的!字段和字段间用,分割,而此处是在一个字段中选择多个选项!
  1. e.g.
  2. //表结构如下:
  3. mysql> desc t_6;
  4. +-------+--------------------------+------+-----+---------+-------+
  5. | Field | Type | Null | Key | Default | Extra |
  6. +-------+--------------------------+------+-----+---------+-------+
  7. | hobby | set('A','B','C','D','E') | YES | | NULL | |
  8. +-------+--------------------------+------+-----+---------+-------+
  9. 1 row in set (0.00 sec)
  10. //插入数据:
  11. mysql> insert into t_6 values('A,B,C');
  12. //查看表中数据:
  13. mysql> select * from t_6;
  14. +-------+
  15. | hobby |
  16. +-------+
  17. | A,B,C |
  18. +-------+
  19. 1 row in set (0.00 sec)

        在存储时set使用2的n次方来存储,即若有n个数据,则有2^n种组合。

6.日期/时间类型 

        实际应用中多使用DATETIME类型。

        每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时使用"零"值。

        TIMESTAMP时间戳类型有专有的自动更新特性,有其特殊的应用,将在后续描述。

  1. //创建字段的格式:
  2. 字段名 datetime/...
  3. //在输入数据时应严格按照当前时间类型对应的格式输入,例如datetime类型:
  4. insert into 表名 values('2021-09-17 01:28:00');

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/716206
推荐阅读
相关标签
  

闽ICP备14008679号