MySQL学习总结之路(第三章:数据类型)
Posted 随风去远方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL学习总结之路(第三章:数据类型)相关的知识,希望对你有一定的参考价值。
目录
1、数值类型
1.1、数值类型分类
严格数值类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC)
近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)
整数类型 | 字节 | 最小值 | 最大值 |
TINYINT
|
1 |
有符号-128
无符号 0
|
有符号 127
无符号 255
|
SMALLINT
|
2
|
有符号-32768
无符号 0
|
有符号 32767
无符号 65535
|
MEDIUMINT
|
3
|
有符号-8388608
无符号 0
|
有符号 8388607
无符号 1677215
|
INT、INTEGER
|
4 |
有符号-2147483648
无符号 0
|
有符号 2147483647
无符号 4294967295
|
BIGINT
|
8 |
有符号-9223372036854775808
无符号 0
|
有符号 9223372036854775807
无符号 18446744073709551615
|
浮点数类型
|
字节
|
最小值 | 最大值 |
FLOAT
|
4
|
±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、浮点数
1.1.2、位类型
mysql> desc t2; +-------+--------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+--------+------+-----+---------+-------+ | id | bit(1) | YES | | NULL | | +-------+--------+------+-----+---------+-------+ 1 row in set (0.00 sec) mysql> insert into t2 values(1); Query OK, 1 row affected (0.05 sec) mysql> select * from t2; +------+ | id | +------+ | | +------+ 1 row in set (0.00 sec) mysql> select bin(id),hex(id) from t2; +---------+---------+ | bin(id) | hex(id) | +---------+---------+ | 1 | 1 | +---------+---------+ 1 row in set (0.03 sec)
bit类型数据插入时,首先将值转换为二进制,如果允许,则进行插入,如果位数小于实际定义的位数,则插入失败。
例:如果在刚刚的那张表中插入2,实际转换为二进制为10,超出了bit(1)的实际定义位数,就会报异常,将id定义为bit(2),在插入,就会成功
mysql> insert into t2 values(2); ERROR 1406 (22001): Data too long for column \'id\' at row 1 mysql> alter table t2 modify id bit(2); Query OK, 1 row affected (0.67 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t2 values(2); Query OK, 1 row affected (0.03 sec) mysql> select bin(id),hex(id) from t2; +---------+---------+ | bin(id) | hex(id) | +---------+---------+ | 1 | 1 | | 10 | 2 | +---------+---------+ 2 rows in set (0.00 sec)
1.1.3、时间日期类型
日期和时间类型 | 字节 | 最小值 | 最大值 |
DATE
|
4
|
1000-01-01
|
9999-12-31
|
DATETIME
|
8
|
1000-01-01 00:00:00
|
9999-12-31 23:59:59
|
TIMESTAMP
|
4 |
19700101080001
|
2038 年的某个时刻
|
TIME
|
3
|
-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 三种日期类型,并插入数值,查看显示结果
mysql> create table dt(d date,t time,dt datetime); Query OK, 0 rows affected (0.23 sec) mysql> insert into dt values(now(),now(),now()); Query OK, 1 row affected, 1 warning (0.05 sec) mysql> select * from dt; +------------+----------+---------------------+ | d | t | dt | +------------+----------+---------------------+ | 2021-05-13 | 10:14:07 | 2021-05-13 10:14:07 | +------------+----------+---------------------+ 1 row in set (0.00 sec)
例2:创建测试表t,字段id1为TIMESTAMP类型,插入空值,并显示
mysql> create table t(id1 timestamp); Query OK, 0 rows affected (0.22 sec) mysql> insert into t values(null); Query OK, 1 row affected (0.05 sec) mysql> select * from t; +---------------------+ | id1 | +---------------------+ | 2021-05-13 10:18:05 | +---------------------+ 1 row in set (0.00 sec)
例3:解释如上说明
mysql> alter table t add column id2 timestamp; Query OK, 0 rows affected (0.48 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table t \\G; *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `id2` timestamp NOT NULL DEFAULT \'0000-00-00 00:00:00\' ) ENGINE=InnoDB DEFAULT CHARSET=latin1 1 row in set (0.00 sec) ERROR: No query specified
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:可变长字符串,在检索时,会保留这些空格
例:
mysql> create table varc(v varchar(4),c char(4)); Query OK, 0 rows affected (0.20 sec) mysql> insert into varc values(\'abc \',\'abc \'); Query OK, 1 row affected (0.03 sec) mysql> select length(v),length(c) from varc; +-----------+-----------+ | length(v) | length(c) | +-----------+-----------+ | 4 | 3 | +-----------+-----------+ 1 row in set (0.01 sec)
mysql> select concat(v,\'+\'),concat(c,\'+\') from varc; +---------------+---------------+ | concat(v,\'+\') | concat(c,\'+\') | +---------------+---------------+ | abc + | abc+ | +---------------+---------------+ 1 row in set (0.00 sec)
mysql> create table bina(c binary(3)); Query OK, 0 rows affected (0.22 sec) mysql> insert into t set c=\'a\'; ERROR 1054 (42S22): Unknown column \'c\' in \'field list\' mysql> insert into bina set c=\'a\'; Query OK, 1 row affected (0.05 sec) mysql> select *,hex(c),c=\'a\',c=\'a\\0\',c=\'a\\0\\0\' from bina; +------+--------+-------+---------+-----------+ | c | hex(c) | c=\'a\' | c=\'a\\0\' | c=\'a\\0\\0\' | +------+--------+-------+---------+-----------+ | a | 610000 | 0 | 0 | 1 | +------+--------+-------+---------+-----------+ 1 row in set (0.00 sec)
1.1.5、ENUM 类型
mysql> create table gend(gender enum(\'M\',\'F\')); Query OK, 0 rows affected (0.20 sec) mysql> insert into gend values(\'M\'),(\'F\'),(\'1\'),(null); Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from gend; +--------+ | gender | +--------+ | M | | F | | M | | NULL | +--------+ 4 rows in set (0.00 sec)
由此可以看出,枚举类型的插入值得时候,是忽略大小写的,初始下标从1开始;查询的时候会转换为大写,也可以插入空(null)
1.1.6、SET类型
SET:字符串对象,里面可以包含64个成员,成员不同,存储上也有所不同
mysql> create table st(col set(\'a\',\'b\',\'c\',\'d\')); Query OK, 0 rows affected (0.20 sec) mysql> insert into st values(\'a,b\'),(\'a,d,a\'),(\'a,c\'),(\'a\'); Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> insert into st values(\'f\'); ERROR 1265 (01000): Data truncated for column \'col\' at row 1 mysql> insert into st values(null); Query OK, 1 row affected (0.03 sec) mysql> select * from st; +------+ | col | +------+ | a,b | | a,d | | a,c | | a | | NULL | +------+ 5 rows in set (0.00 sec)
由此可以看出,set是可以插入多个成员的,也可以插入null,插入不存在的定义列时,会报异常插入失败
此章节完成
以上是关于MySQL学习总结之路(第三章:数据类型)的主要内容,如果未能解决你的问题,请参考以下文章
[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段