经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MySQL » 查看文章
MySQL 数据类型详情
来源:jb51  时间:2021/11/9 15:50:51  对本文有异议

1、数值类型

1.1、数值类型分类

  • 严格数值类型(INTEGERSMALLINTDECIMAL NUMERIC
  • 近似数值数据类型(FLOATREAL DOUBLE PRECISION

MySQL中数值类型:

整数类型 字节  最小值 最大值
TINYINT
1
有符号-128
无符号 0
有符号 127
无符号 255
SMALLINT
有符号-32768
无符号 0
有符号 32767
无符号 65535 
MEDIUMINT 
有符号-8388608
无符号 0
有符号 8388607
无符号 1677215
INT、INTEGER
4
有符号-2147483648
无符号 0 
有符号 2147483647
无符号 4294967295
BIGINT
8
有符号-9223372036854775808
无符号 0
有符号 9223372036854775807
无符号 18446744073709551615
浮点数类型
字节
最小值 最大值
FLOAT 
±1.175494351E-38 
±3.402823466E+38 
DOUBLE 
8
±2.2250738585072014E-308 
±1.7976931348623157E+308 
定点数类型 
字节 描述
DEC(M,D),
DECIMAL(M,D) 
M+2
最大取值范围与 DOUBLE 相同,给定 DECIMAL 的有效取值范围由 M 和 D
决定
位类型 
字节
最小值 最大值
BIT(M)
1~8 
BIT(1)
BIT(64) 

1.1.1、浮点数

浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错;定点数如果不写精度和标度,则按照默认值 decimal(10,0)来进行操作,并且如果数据超越了精度和标度值,系统则会报错。

1.1.2、位类型

BIT(位)类型:范围从1-64,如果不写,默认为1位,对于此字段,直接使用select命令将不会看到结果,可以用bin()(显示为二进制格式)或者hex()(显示为16进制格式)函数进行读取

例:

  1. mysql> desc t2;
  2. +-------+--------+------+-----+---------+-------+
  3. | Field | Type | Null | Key | Default | Extra |
  4. +-------+--------+------+-----+---------+-------+
  5. | id | bit(1) | YES | | NULL | |
  6. +-------+--------+------+-----+---------+-------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> insert into t2 values(1);
  10. Query OK, 1 row affected (0.05 sec)
  11.  
  12. mysql> select * from t2;
  13. +------+
  14. | id |
  15. +------+
  16. |  |
  17. +------+
  18. 1 row in set (0.00 sec)
  19.  
  20. mysql> select bin(id),hex(id) from t2;
  21. +---------+---------+
  22. | bin(id) | hex(id) |
  23. +---------+---------+
  24. | 1 | 1 |
  25. +---------+---------+
  26. 1 row in set (0.03 sec)
  27.  

bit类型数据插入时,首先将值转换为二进制,如果允许,则进行插入,如果位数小于实际定义的位数,则插入失败。

例:如果在刚刚的那张表中插入2,实际转换为二进制为10,超出了bit(1)的实际定义位数,就会报异常,将id定义为bit(2),在插入,就会成功

  1. mysql> insert into t2 values(2);
  2. ERROR 1406 (22001): Data too long for column 'id' at row 1
  3. mysql> alter table t2 modify id bit(2);
  4. Query OK, 1 row affected (0.67 sec)
  5. Records: 1 Duplicates: 0 Warnings: 0
  6.  
  7. mysql> insert into t2 values(2);
  8. Query OK, 1 row affected (0.03 sec)
  9.  
  10. mysql> select bin(id),hex(id) from t2;
  11. +---------+---------+
  12. | bin(id) | hex(id) |
  13. +---------+---------+
  14. | 1 | 1 |
  15. | 10 | 2 |
  16. +---------+---------+
  17. 2 rows in set (0.00 sec)
  18.  

1.1.3、时间日期类型

1.1.3、时间日期类型

日期和时间类型 字节 最小值 最大值
DATE 
1000-01-01 
9999-12-31 
DATETIME
1000-01-01 00:00:00
9999-12-31 23:59:59 
TIMESTAMP
4
19700101080001 
2038 年的某个时刻 
TIME 
-838:59:59
838:59:59 
YEAR
1 1901
2155 
  • DATE:用来表示年月日
  • DATETIME:用来表示年月日时分秒(支持插入格式:2007-9-3 12:10:10'、'2007/9/3 12+10+10'、'20070903121010'、20070903121010 等)
  • TIME:只用来表示时分秒
  • TIMESTAMP:经常插入或者更新日期为当前系统时间
  • YEAR:表示年

例1:创建时间表(dt),字段分别为 date、time、datetime 三种日期类型,并插入数值,查看显示结果

  1. mysql> create table dt(d date,t time,dt datetime);
  2. Query OK, 0 rows affected (0.23 sec)
  3.  
  4.  
  5. mysql> insert into dt values(now(),now(),now());
  6. Query OK, 1 row affected, 1 warning (0.05 sec)
  7.  
  8. mysql> select * from dt;
  9. +------------+----------+---------------------+
  10. | d | t | dt |
  11. +------------+----------+---------------------+
  12. | 2021-05-13 | 10:14:07 | 2021-05-13 10:14:07 |
  13. +------------+----------+---------------------+
  14. 1 row in set (0.00 sec)
  15.  

 例2:创建测试表t,字段id1为TIMESTAMP类型,插入空值,并显示

  1. mysql> create table t(id1 timestamp);
  2. Query OK, 0 rows affected (0.22 sec)
  3.  
  4. mysql> insert into t values(null);
  5. Query OK, 1 row affected (0.05 sec)
  6.  
  7. mysql> select * from t;
  8. +---------------------+
  9. | id1 |
  10. +---------------------+
  11. | 2021-05-13 10:18:05 |
  12. +---------------------+
  13. 1 row in set (0.00 sec)
  14.  

可以发现,系统给 id1 自动创建了默认值 CURRENT_TIMESTAMP(系统日期)。(注意,MySQL只给表中的第一个TIMESTAMP字段设置默认值为系统日期,如果有第二个TIMESTAMP类型,则默认值设置为0值)

例3:解释如上说明

  1. mysql> alter table t add column id2 timestamp;
  2. Query OK, 0 rows affected (0.48 sec)
  3. Records: 0 Duplicates: 0 Warnings: 0
  4.  
  5. mysql> show create table t \G;
  6. *************************** 1. row ***************************
  7. Table: t
  8. Create Table: CREATE TABLE `t` (
  9. `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  10. `id2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
  11. ) ENGINE=InnoDB DEFAULT CHARSET=latin1
  12. 1 row in set (0.00 sec)
  13.  
  14. ERROR:
  15. No query specified
  16.  

1.1.4、字符串类型

字符串类型 字节 描述及存储需求
CHAR(M) 
M
M 为 0~255 之间的整数
VARCHAR(M)
 
M 为 0~65535 之间的整数,值的长度+1 个字节
TINYBLOB
 
允许长度 0~255 字节,值的长度+1 个字节
BLOB 
 
允许长度 0~65535 字节,值的长度+2 个字节
MEDIUMBLOB
 
允许长度 0~167772150 字节,值的长度+3 个字节
LONGBLOB
 
允许长度 0~4294967295 字节,值的长度+4 个字节
TINYTEXT
 
允许长度 0~255 字节,值的长度+2 个字节 
TEXT 
 
允许长度 0~65535 字节,值的长度+2 个字节 
MEDIUMTEXT 
 
允许长度 0~167772150 字节,值的长度+3 个字节
LONGTEXT 
 
允许长度 0~4294967295 字节,值的长度+4 个字节
VARBINARY(M)
 
允许长度 0~M 个字节的变长字节字符串,值的长度+1 个字节
BINARY(M) 
M
允许长度 0~M 个字节的定长字节字符串 

  • CHAR:固定长度,在检索时,会删除尾部的空格
  • VARCHAR:可变长字符串,在检索时,会保留这些空格

例:

  1. mysql> create table varc(v varchar(4),c char(4));
  2. Query OK, 0 rows affected (0.20 sec)
  3.  
  4. mysql> insert into varc values('abc ','abc ');
  5. Query OK, 1 row affected (0.03 sec)
  6.  
  7. mysql> select length(v),length(c) from varc;
  8. +-----------+-----------+
  9. | length(v) | length(c) |
  10. +-----------+-----------+
  11. | 4 | 3 |
  12. +-----------+-----------+
  13. 1 row in set (0.01 sec)
  14. mysql> select concat(v,'+'),concat(c,'+') from varc;
  15. +---------------+---------------+
  16. | concat(v,'+') | concat(c,'+') |
  17. +---------------+---------------+
  18. | abc + | abc+ |
  19. +---------------+---------------+
  20. 1 row in set (0.00 sec)
  21.  
  •  BINARY:类似于char,但他是二进制字符串
  • VARBINARY:类似于varchar,单他是存储二进制字符串

例:

  1. mysql> create table bina(c binary(3));
  2. Query OK, 0 rows affected (0.22 sec)
  3.  
  4. mysql> insert into t set c='a';
  5. ERROR 1054 (42S22): Unknown column 'c' in 'field list'
  6. mysql> insert into bina set c='a';
  7. Query OK, 1 row affected (0.05 sec)
  8.  
  9. mysql> select *,hex(c),c='a',c='a\0',c='a\0\0' from bina;
  10. +------+--------+-------+---------+-----------+
  11. | c | hex(c) | c='a' | c='a\0' | c='a\0\0' |
  12. +------+--------+-------+---------+-----------+
  13. | a | 610000 | 0 | 0 | 1 |
  14. +------+--------+-------+---------+-----------+
  15. 1 row in set (0.00 sec)
  16.  

可以发现,当保存 BINARY 值时,在值的最后通过填充“0x00”(零字节)以达到指定的字段定义长度。从上例中看出,对于一个 BINARY(3)列,当插入时'a'变为'a\0\0'

1.1.5、ENUM 类型

ENUM:对 1~255 个成员的枚举需要 1 个字节存储;对于 255~65535 个成员,需要 2 个字节存储。

例:

  1. mysql> create table gend(gender enum('M','F'));
  2. Query OK, 0 rows affected (0.20 sec)
  3.  
  4. mysql> insert into gend values('M'),('F'),('1'),(null);
  5. Query OK, 4 rows affected (0.03 sec)
  6. Records: 4 Duplicates: 0 Warnings: 0
  7.  
  8. mysql> select * from gend;
  9. +--------+
  10. | gender |
  11. +--------+
  12. | M |
  13. | F |
  14. | M |
  15. | NULL |
  16. +--------+
  17. 4 rows in set (0.00 sec)
  18.  

由此可以看出,枚举类型的插入值得时候,是忽略大小写的,初始下标从1开始;查询的时候会转换为大写,也可以插入空(null)

1.1.6、SET类型

SET:字符串对象,里面可以包含64个成员,成员不同,存储上也有所不同

1~8 成员的集合,占 1 个字节。
9~16 成员的集合,占 2 个字节。
17~24 成员的集合,占 3 个字节。
25~32 成员的集合,占 4 个字节。
33~64 成员的集合,占 8 个字节。
SetEMUN区别在于,Set一次可以选则多个成员,而ENUM则只能选择一个

例:

  1. mysql> create table st(col set('a','b','c','d'));
  2. Query OK, 0 rows affected (0.20 sec)
  3.  
  4. mysql> insert into st values('a,b'),('a,d,a'),('a,c'),('a');
  5. Query OK, 4 rows affected (0.03 sec)
  6. Records: 4 Duplicates: 0 Warnings: 0
  7.  
  8. mysql> insert into st values('f');
  9. ERROR 1265 (01000): Data truncated for column 'col' at row 1
  10. mysql> insert into st values(null);
  11. Query OK, 1 row affected (0.03 sec)
  12.  
  13. mysql> select * from st;
  14. +------+
  15. | col |
  16. +------+
  17. | a,b |
  18. | a,d |
  19. | a,c |
  20. | a |
  21. | NULL |
  22. +------+
  23. 5 rows in set (0.00 sec)
  24.  

由此可以看出,set是可以插入多个成员的,也可以插入null,插入不存在的定义列时,会报异常插入失败

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号