mysql中的数据类型
int示例
#int示例
#创建一个表,一个默认宽度的int,一个指定宽度的int(5)
mysql> create table t1(id1 int ,id2 int(5));
Query OK, 0 rows affected (0.03 sec)
#插入数据1
mysql> insert into t1 values(1,1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+------+------+
| id1 | id2 |
+------+------+
| 1 | 1 |
+------+------+
1 row in set (0.00 sec)
mysql> insert into t1 values (111111,111111);
Query OK, 1 row affected (0.00 sec)
#id2显示了正确的数值,没有受到宽度限制的影响
mysql> select * from t1;
+--------+--------+
| id1 | id2 |
+--------+--------+
| 1 | 1 |
| 111111 | 111111 |
+--------+--------+
2 rows in set (0.00 sec)
mysql> show create table t1;
+-------+--------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`id1` int(11) DEFAULT NULL,
`id2` int(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> into t1 values (22222222,22222222);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+----------+----------+
| id1 | id2 |
+----------+----------+
| 1 | 1 |
| 111111 | 111111 |
| 22222222 | 22222222 |
+----------+----------+
3 rows in set (0.00 sec)
#修改id1字段,给字段添加一个unsigned表示无符号
mysql> alter table t1 modify id1 int unsigned;
Query OK, 3 rows affected (0.04 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> desc t1;
+-------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id1 | int(10) unsigned | YES | | NULL | |
| id2 | int(5) | YES | | NULL | |
+-------+------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
#当给id1添加的数据大于2147483647时,可以顺利插入
mysql> insert into t1 values (2147483648,2147483647);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t1;
+------------+------------+
| id1 | id2 |
+------------+------------+
| 1 | 1 |
| 111111 | 111111 |
| 22222222 | 22222222 |
| 2147483648 | 2147483647 |
+------------+------------+
4 rows in set (0.00 sec)
#当个id2添加的数据大于2147483647时,会报错
mysql> insert into t1 values (2147483648,2147483649);
ERROR 1264 (22003): O
小数示例
#小数示例
mysql> create table t2 (id1 float(5,2),id2 double(5,2),id3 decimal(5,2));
Query OK, 0 rows affected (0.02 sec)
mysql> desc t2;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id1 | float(5,2) | YES | | NULL | |
| id2 | double(5,2) | YES | | NULL | |
| id3 | decimal(5,2) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into t2 values(1.23,1.23,1.23);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+------+------+------+
| id1 | id2 | id3 |
+------+------+------+
| 1.23 | 1.23 | 1.23 |
+------+------+------+
1 row in set (0.00 sec)
mysql> insert into t2 values(1.234,1.234,1.234);
Query OK, 1 row affected, 1 warning (0.01 sec)
#向表中插入1.234,会发现4都被截断了
mysql> select * from t2;
+------+------+------+
| id1 | id2 | id3 |
+------+------+------+
| 1.23 | 1.23 | 1.23 |
| 1.23 | 1.23 | 1.23 |
+------+------+------+
2 rows in set (0.00 sec)
mysql> insert into t2 values(1.235,1.235,1.235);
Query OK, 1 row affected, 1 warning (0.00 sec)
#遵循四舍五入的规则
mysql> select * from t2;
+------+------+------+
| id1 | id2 | id3 |
+------+------+------+
| 1.23 | 1.23 | 1.23 |
| 1.23 | 1.23 | 1.23 |
| 1.24 | 1.24 | 1.24 |
+------+------+------+
3 rows in set (0.00 sec)
#去掉参数约束
mysql> create table t3(id1 float,id2 double,id3 decimal);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t3 values(1.234,1.234,1.234);
Query OK, 1 row affected, 1 warning (0.00 sec)
#发现decimal默认值是(10,0)的整数
mysql> select * from t3;
+-------+-------+------+
| id1 | id2 | id3 |
+-------+-------+------+
| 1.234 | 1.234 | 1 |
+-------+-------+------+
1 row in set (0.00 sec)
mysql> insert into t3 values(1.2345678,1.2345678678,1.2345678);
Query OK, 1 row affected, 1 warning (0.00 sec)
#当对小数位没有约束的时候,输入超长的小数,发现float和double的区别
mysql> select * from t3;
+---------+--------------+------+
| id1 | id2 | id3 |
+---------+--------------+------+
| 1.234 | 1.234 | 1 |
| 1.23457 | 1.2345678678 | 1 |
+---------+--------------+------+
2 rows in set (0.00 sec)
date ,time,datetime示例
mysql> create table t4(d date,t time,dt datetime);
Query OK, 0 rows affected (0.02 sec)
mysql> desc t4;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d | date | YES | | NULL | |
| t | time | YES | | NULL | |
| dt | datetime | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into t4 values(now(),now(),now());
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from t4;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2020-01-07 | 22:12:29 | 2020-01-07 22:12:29 |
+------------+----------+---------------------+
1 row in set (0.00 sec)
mysql> insert into t4 values(null,null,null);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t4;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2020-01-07 | 22:12:29 | 2020-01-07 22:12:29 |
| NULL | NULL | NULL |
+------------+----------+---------------------+
2 rows in set (0.00 sec)
timestamp示例
#timestamp示例
mysql> create table t5 (id1 timestamp);
Query OK, 0 rows affected (0.01 sec)
mysql> desc t5;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+-------------------+-----------------------------+
| id1 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
1 row in set (0.00 sec)
#插入数据null,会自动插入当前时间的时间
mysql> insert values(null);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t5;
+---------------------+
| id1 |
+---------------------+
| 2020-01-07 22:15:26 |
+---------------------+
1 row in set (0.00 sec)
mysql> alter table t5 add id2 timestamp;
ERROR 1067 (42000): Invalid default value for 'id2'
#设置默认时间为当前的时间
mysql> alter table t5 add id2 timestamp default current_timestamp;
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from t5;
+---------------------+---------------------+
| id1 | id2 |
+---------------------+---------------------+
| 2020-01-07 22:15:26 | 2020-01-07 22:21:41 |
+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> show create table t5;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t5 | CREATE TABLE `t5` (
`id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`id2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> inser t5 values (null,null);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t5;
+---------------------+---------------------+
| id1 | id2 |
+---------------------+---------------------+
| 2020-01-07 22:15:26 | 2020-01-07 22:21:41 |
| 2020-01-07 22:23:04 | 2020-01-07 22:23:04 |
+---------------------+---------------------+
2 rows in set (0.00 sec)
mysql> insert into t5 values (19700101080001);
ERROR 1136 (21S01): Column count doesn't match value count at row 1
mysql> insert into t5 values (19700101080001,null);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t5;
+---------------------+---------------------+
| id1 | id2 |
+---------------------+---------------------+
| 2020-01-07 22:15:26 | 2020-01-07 22:21:41 |
| 2020-01-07 22:23:04 | 2020-01-07 22:23:04 |
| 1970-01-01 08:00:01 | 2020-01-07 22:25:39 |
+---------------------+---------------------+
3 rows in set (0.00 sec)
#timestamp时间下限是19700101080001
mysql> insert into t5 values (19700101080000,null);
ERROR 1292 (22007): Incorrect datetime value: '19700101080000' for column 'id1' at row 1
mysql> insert into t5 values('2038-01-19 11:14:07',null);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t5;
+---------------------+---------------------+
| id1 | id2 |
+---------------------+---------------------+
| 2020-01-07 22:15:26 | 2020-01-07 22:21:41 |
| 2020-01-07 22:23:04 | 2020-01-07 22:23:04 |
| 1970-01-01 08:00:01 | 2020-01-07 22:25:39 |
| 2038-01-19 11:14:07 | 2020-01-07 22:27:09 |
+---------------------+---------------------+
4 rows in set (0.00 sec)
#timestamp时间的上限是2038-01-19 11:14:07
mysql> insert into t5 values('2038-01-19 11:14:08',null);
ERROR 1292 (22007): Incorrect datetime value: '2038-01-19 11:14:08' for column 'id1' at row 1
datetime示例
#datetime示例
mysql> create table t6 (dt datetime);
Query OK, 0 rows affected (0.01 sec)
mysql> desc t6;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| dt | datetime | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> insert into t6 values('2019-9-2 12:20:11');
Query OK, 1 row affected (0.00 sec)
mysql> insert into t6 values('2018/9/2 12:20:11');
Query OK, 1 row affected (0.01 sec)
mysql> insert into t6 values ('20180902122011');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t6;
+---------------------+
| dt |
+---------------------+
| 2019-09-02 12:20:11 |
| 2018-09-02 12:20:11 |
| 2018-09-02 12:20:11 |
+---------------------+
3 rows in set (0.00 sec)
char varchar示例
mysql> create table t7 (v varchar(4),c char(4));
Query OK, 0 rows affected (0.01 sec)
mysql> desc t7;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| v | varchar(4) | YES | | NULL | |
| c | char(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into t7 values ('ab ','ab ');
Query OK, 1 row affected (0.00 sec)
#在检索的时候char数据类型会去掉空格
mysql> select * from t7 ;
+------+------+
| v | c |
+------+------+
| ab | ab |
+------+------+
1 row in set (0.00 sec)
#查询结果计算的长度
mysql> select length(v),length(c) from t7;
+-----------+-----------+
| length(v) | length(c) |
+-----------+-----------+
| 4 | 2 |
+-----------+-----------+
1 row in set (0.02 sec)
#给结构拼上一个加号
mysql> select concat(v,'+'),concat(c,'+') from t7;
+---------------+---------------+
| concat(v,'+') | concat(c,'+') |
+---------------+---------------+
| ab + | ab+ |
+---------------+---------------+
1 row in set (0.00 sec)
#当存储的长度超出定义的长度,会截断
mysql> insert into t7 values ('abcd ','abcd ');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select concat(v,'+'),concat(c,'+') from t7;
+---------------+---------------+
| concat(v,'+') | concat(c,'+') |
+---------------+---------------+
| ab + | ab+ |
| abcd+ | abcd+ |
+---------------+---------------+
2 rows in set (0.00 sec)
enum set示例
mysql> create table t8(name char(20),gender enum('female','male'));
Query OK, 0 rows affected (0.02 sec)
mysql> desc t8;
+--------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-----------------------+------+-----+---------+-------+
| name | char(20) | YES | | NULL | |
| gender | enum('female','male') | YES | | NULL | |
+--------+-----------------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
# 选择enum('female','male')中的一项作为gender的值,可以正常插入
mysql> insert into t8 values ('chen','male');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t8;
+------+--------+
| name | gender |
+------+--------+
| chen | male |
+------+--------+
1 row in set (0.00 sec)
# 不能同时插入('female','male')两个值,也不能插入不属于('female','male')的值
mysql> insert into t8 values ('chen','male,female');
ERROR 1265 (01000): Data truncated for column 'gender' at row 1
mysql> create table t9 (name char(20),hobby set('看书','打乒乓球','玩游戏','旅游'));
Query OK, 0 rows affected (0.02 sec)
mysql> desc t9;
+-------+---------------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------------------------------------+------+-----+---------+-------+
| name | char(20) | YES | | NULL | |
| hobby | set('看书','打乒乓球','玩游戏','旅游') | YES | | NULL | |
+-------+---------------------------------------------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
# 可以任意选择set('看书','打乒乓球','玩游戏','旅游')中的项,并带去重功能
mysql> insert into t9 values ('chen','看书,玩游戏');
-> ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ';' at line 1
mysql> insert into t9 values ('chen','看书,玩游戏');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t9;
+------+------------------+
| name | hobby |
+------+------------------+
| chen | 看书,玩游戏 |
+------+------------------+
1 row in set (0.00 sec)
mysql> insert into t9 values ('chen','看书,看书,看书,旅游');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t9;
+------+------------------+
| name | hobby |
+------+------------------+
| chen | 看书,玩游戏 |
| chen | 看书,旅游 |
+------+------------------+
2 rows in set (0.00 sec)
# 不能选择不属于set('看书','打乒乓球','玩游戏','旅游')中的项
mysql> insert into t9 values('chen','打游戏,听歌');
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1