数据库学习-数据类型
- 数据类型
- 字符类型
- 定长char
- 例:定义表结构的定长:
- 变长 varchar
- 例:创建表,定义变长
- 练习字符类型
- 数值类型
- 整数(tinyint, smallint, mediumint, int, bigint, unsigned)
- 以mysql> desc mysql.user; 为例
- 例:建个字段类型为微小整数的结构
- 在没有定义无符号范围时,字长还要算上“—”负号,多占一位
- 浮点型(float单精度、double双精度)
- 例:建表,type定义浮点型
- 日期时间类型
- 例,按要求创建表
- 显示时间:
- 年,默认4位,如果写2位,会自动补全
- 枚举类型(让表头的值在列举的范围里选)
数据类型
字符类型
1、有定长和变长两类。
2、通常赋值时,用双引号引起。
3、一个英语字母,就占用一个字符。
定长char
mysql> desc mysql.user;
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host | char(255) | NO | PRI | | |
| User | char(32) | NO | PRI |
| ssl_cipher | blob | NO | | NULL | |
| x509_issuer | blob | NO | | NULL | |
| x509_subject | blob | NO | | NULL | |
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
| plugin | char(64) | NO | | caching_sha2_password | |
| authentication_string | text | YES | | NULL | |
例:定义表结构的定长:
创建表,定义字符长度char
mysql> create table db1.st2( name char(5), address char(50) );
Query OK, 0 rows affected (0.17 sec)
mysql> show create table db1.st2 \G;
*************************** 1. row ***************************
Table: st2
Create Table: CREATE TABLE `st2` (
`name` char(5) DEFAULT NULL,
`address` char(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)
ERROR:
No query specified
mysql> select * from db1.st2;
Empty set (0.00 sec)
mysql> insert into db1.st2 values ("tom","USA");
Query OK, 1 row affected (0.00 sec)
mysql> select * from db1.st2;
+------+---------+
| name | address |
+------+---------+
| tom | USA |
+------+---------+
1 row in set (0.00 sec)
mysql> insert into db1.st2 values ("BOB","USA");
Query OK, 1 row affected (0.07 sec)
mysql> select * from db1.st2;
+------+---------+
| name | address |
+------+---------+
| tom | USA |
| BOB | USA |
+------+---------+
2 rows in set (0.00 sec)
创建超过5个字符的内容,报错数据太长
mysql> insert into db1.st2 values ("zhangsan","USA");
ERROR 1406 (22001): Data too long for column 'name' at row 1
变长 varchar
字符<=65532个字符
例:创建表,定义变长
mysql> create table db1.st3 (name char(6),email varchar(30));
Query OK, 0 rows affected (0.26 sec)
mysql> select * from db1.st3;
Empty set (0.03 sec)
mysql> insert into db1.st3 values ("BOB","guangdong-zhenzhen-baoan-xixiang");
ERROR 1406 (22001): Data too long for column 'email' at row 1
mysql> insert into db1.st3 values ("BOB","666777888.qq.com");
Query OK, 1 row affected (0.04 sec)
mysql> select * from db1.st3;
+------+------------------+
| name | email |
+------+------------------+
| BOB | 666777888.qq.com |
+------+------------------+
1 row in set (0.00 sec)
mysql> insert into db1.st3 values ("tom","444555666777888.qq.com");
Query OK, 1 row affected (0.07 sec)
mysql> select * from db1.st3;
+------+------------------------+
| name | email |
+------+------------------------+
| BOB | 666777888.qq.com |
| tom | 444555666777888.qq.com |
+------+------------------------+
2 rows in set (0.00 sec)
mysql> insert into db1.st3 values ("TOM","222333444555666777888.qq.com");
Query OK, 1 row affected (0.00 sec)
mysql> select * from db1.st3;
+------+------------------------------+
| name | email |
+------+------------------------------+
| BOB | 666777888.qq.com |
| tom | 444555666777888.qq.com |
| TOM | 222333444555666777888.qq.com |
+------+------------------------------+
3 rows in set (0.00 sec)
练习字符类型
mysql> create table db1.test1(name char(5),mail varchar(10),homeaddr varchar(50));
Query OK, 0 rows affected (1.06 sec)
mysql> show create table db1.test1;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test1 | CREATE TABLE `test1` (
`name` char(5) DEFAULT NULL,
`mail` varchar(10) DEFAULT NULL,
`homeaddr` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> select * from db1.test1;
Empty set (0.00 sec)
mysql> desc db1.test1;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| name | char(5) | YES | | NULL | |
| mail | varchar(10) | YES | | NULL | |
| homeaddr | varchar(50) | YES | | NULL | |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.05 sec)
数值类型
1、分整数、浮点数
整数(tinyint, smallint, mediumint, int, bigint, unsigned)
以mysql> desc mysql.user; 为例
| max_questions | int(11) unsigned | NO | | 0 | |
| max_updates | int(11) unsigned | NO | | 0 | |
| max_connections | int(11) unsigned | NO | | 0 | |
| max_user_connections | int(11) unsigned | NO | | 0 | |
| plugin | char(64) | NO | | caching_sha2_password | |
| authentication_string | text | YES | | NULL | |
| password_expired | enum('N','Y') | NO | | N | |
| password_last_changed | timestamp | YES | | NULL | |
| password_lifetime | smallint(5) unsigned | YES | | NULL
这里有int(11)位,无符号范围,小整数smallint(5)位,无符号范围
例:建个字段类型为微小整数的结构
mysql> create table db1.test2 (name char(10), age tinyint unsigned);
Query OK, 0 rows affected (2.86 sec)
mysql> desc db1.test2;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
| age | tinyint(3) unsigned | YES | | NULL | |
+-------+---------------------+------+-----+---------+-------+
2 rows in set (0.11 sec)
1、这里的 tinyint(3),3表示字长3位,0-255。
2、超过255,就会报错。
mysql> insert into db1.test2 values ("haha","100"),("hehe","800");
ERROR 1264 (22003): Out of range value for column 'age' at row 2
mysql> insert into db1.test2 values ("haha","100"),("hehe","80");
Query OK, 2 rows affected (0.31 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from db1.test2;
+------+------+
| name | age |
+------+------+
| haha | 100 |
| hehe | 80 |
+------+------+
2 rows in set (0.00 sec)
3、如果是小数,会四舍五入
mysql> insert into db1.test2 values ("haha","100"),("hehe","80.22");
Query OK, 2 rows affected (0.19 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> insert into db1.test2 values ("haha","100"),("hehe","80.56");
Query OK, 2 rows affected (0.03 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from db1.test2;
+------+------+
| name | age |
+------+------+
| haha | 100 |
| hehe | 80 |
| haha | 100 |
| hehe | 80 |
| haha | 100 |
| hehe | 81 |
+------+------+
6 rows in set (0.00 sec)
在没有定义无符号范围时,字长还要算上“—”负号,多占一位
mysql> create table db1.test3 (name char(10), age tinyint );
Query OK, 0 rows affected (0.33 sec)
mysql> desc db1.test3;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.18 sec)
mysql> insert into db1.test3 values ("haha","-100"),("hehe","80");
Query OK, 2 rows affected (0.21 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from db1.test3;
+------+------+
| name | age |
+------+------+
| haha | -100 |
| hehe | 80 |
+------+------+
2 rows in set (0.00 sec)
浮点型(float单精度、double双精度)
例:建表,type定义浮点型
mysql> desc db1.test4;
+-------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| pay | float | YES | | NULL | |
| id | double | YES | | NULL | |
+-------+--------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> select * from db1.test4;
+-------------+-----------+
| pay | id |
+-------------+-----------+
| 152.69 | 1542.2453 |
| 15452100000 | 1542.2453 |
| 6442570 | 1542.2453 |
| 12572.7 | 1542.2453 |
| 12572.7 | 1542.2453 |
| 953.81 | 1542.2453 |
+-------------+-----------+
6 rows in set (0.00 sec)
1、不指定float的小数位,默认四舍五入,保留一位小数
mysql> insert into db1.test4 values (27898.67,15422453.98);
Query OK, 1 row affected (0.06 sec)
mysql> select * from db1.test4;
+-------------+-------------+
| pay | id |
+-------------+-------------+
| 152.69 | 1542.2453 |
| 15452100000 | 1542.2453 |
| 6442570 | 1542.2453 |
| 953.81 | 1542.2453 |
| 27898.7 | 15422453.98 |
+-------------+-------------+
7 rows in set (0.00 sec)
2、定义浮点型的宽度和小数位
宽度就是整数位+小数位的和
mysql> create table db1.test5 (pay float(6,3),id double(6,2));
Query OK, 0 rows affected, 2 warnings (0.39 sec)
mysql> desc db1.test5
-> ;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| pay | float(6,3) | YES | | NULL | |
| id | double(6,2) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> insert into db1.test5 values (278.67,1553.98);
Query OK, 1 row affected (0.00 sec)
mysql> select * from db1.test5;
+---------+---------+
| pay | id |
+---------+---------+
| 278.670 | 1553.98 |
+---------+---------+
1 row in set (0.00 sec)
mysql> insert into db1.test5 values (27.1467,155.398);
Query OK, 1 row affected (0.05 sec)
mysql> select * from db1.test5;
+---------+---------+
| pay | id |
+---------+---------+
| 278.670 | 1553.98 |
| 278.670 | 155.40 |
| 278.467 | 155.40 |
| 27.147 | 155.40 |
+---------+---------+
4 rows in set (0.00 sec)
mysql> insert into db1.test5 values (-67.146,5.328);
Query OK, 1 row affected (0.09 sec)
mysql> select * from db1.test5;
+---------+---------+
| pay | id |
+---------+---------+
| 278.670 | 1553.98 |
| 278.670 | 155.40 |
| 278.467 | 155.40 |
| 27.147 | 155.40 |
| -67.146 | 5.33 |
+---------+---------+
5 rows in set (0.00 sec)
日期时间类型
例,按要求创建表
mysql> create table db1.test6 ( name char(10), start year, up_class time, birthday date, party datetime );
Query OK, 0 rows affected (0.25 sec)
09
mysql> desc test6
-> ;
+----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| name | char(10) | YES | | NULL | |
| start | year(4) | YES | | NULL | |
| up_class | time | YES | | NULL | |
| birthday | date | YES | | NULL | |
| party | datetime | YES | | NULL | |
+----------+----------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> insert into test6 values ("bob","1997","09:00:00","20210516","20210716203000");
Query OK, 1 row affected (0.07 sec)
mysql> select * from test6;
+------+-------+----------+------------+---------------------+
| name | start | up_class | birthday | party |
+------+-------+----------+------------+---------------------+
| bob | 1997 | 09:00:00 | 2021-05-16 | 2021-07-16 20:30:00 |
+------+-------+----------+------------+---------------------+
1 row in set (0.00 sec)
mysql> insert into test6 values ("bob","1999","09:00:00","20210516",now());
Query OK, 1 row affected (0.09 sec)
mysql> select * from test6;
+------+-------+----------+------------+---------------------+
| name | start | up_class | birthday | party |
+------+-------+----------+------------+---------------------+
| bob | 1997 | 09:00:00 | 2021-05-16 | 2021-07-16 20:30:00 |
| bob | 1999 | 09:00:00 | 2021-05-16 | 2023-05-06 15:29:15 |
+------+-------+----------+------------+---------------------+
2 rows in set (0.01 sec)
mysql> insert into test6 values ("bob","2004",curtime(),curdate(),now());
Query OK, 1 row affected (0.09 sec)
mysql> select * from test6;
+------+-------+----------+------------+---------------------+
| name | start | up_class | birthday | party |
+------+-------+----------+------------+---------------------+
| bob | 1997 | 09:00:00 | 2021-05-16 | 2021-07-16 20:30:00 |
| bob | 1999 | 09:00:00 | 2021-05-16 | 2023-05-06 15:29:15 |
| bob | 2004 | 15:30:53 | 2023-05-06 | 2023-05-06 15:30:53 |
+------+-------+----------+------------+---------------------+
3 rows in set (0.00 sec)
显示时间:
mysql> select day(now());
+------------+
| day(now()) |
+------------+
| 6 |
+------------+
1 row in set (0.02 sec)
mysql> select month(now());
+--------------+
| month(now()) |
+--------------+
| 5 |
+--------------+
1 row in set (0.02 sec)
mysql> insert into test6 values ("tom",year(now()), time(now()),date(now()),now());
Query OK, 1 row affected (0.13 sec)
mysql> select * from test6;
+------+-------+----------+------------+---------------------+
| name | start | up_class | birthday | party |
+------+-------+----------+------------+---------------------+
| bob | 1997 | 09:00:00 | 2021-05-16 | 2021-07-16 20:30:00 |
| bob | 1999 | 09:00:00 | 2021-05-16 | 2023-05-06 15:29:15 |
| bob | 2004 | 15:30:53 | 2023-05-06 | 2023-05-06 15:30:53 |
| tom | 2023 | 15:37:04 | 2023-05-06 | 2023-05-06 15:37:04 |
+------+-------+----------+------------+---------------------+
4 rows in set (0.01 sec)
mysql> create table test7 (meeting datetime,party timestamp);
Query OK, 0 rows affected (0.36 sec)
mysql> desc test7;
+---------+-----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-----------+------+-----+---------+-------+
| meeting | datetime | YES | | NULL | |
| party | timestamp | YES | | NULL | |
+---------+-----------+------+-----+---------+-------+
2 rows in set (0.05 sec)
mysql> insert into test7 values(now(),now() );
Query OK, 1 row affected (0.10 sec)
mysql> select * from test7;
+---------------------+---------------------+
| meeting | party |
+---------------------+---------------------+
| 2023-05-06 16:15:42 | 2023-05-06 16:15:42 |
+---------------------+---------------------+
1 row in set (0.00 sec)
mysql> insert into test7(meeting) values(20211223112634);
Query OK, 1 row affected (0.07 sec)
mysql> select * from test7;
+---------------------+---------------------+
| meeting | party |
+---------------------+---------------------+
| 2023-05-06 16:15:42 | 2023-05-06 16:15:42 |
| 2021-12-23 11:26:34 | NULL |
+---------------------+---------------------+
2 rows in set (0.00 sec)
mysql> insert into test7(party) values(20211223112634);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test7;
+---------------------+---------------------+
| meeting | party |
+---------------------+---------------------+
| 2023-05-06 16:15:42 | 2023-05-06 16:15:42 |
| 2021-12-23 11:26:34 | NULL |
| NULL | 2021-12-23 11:26:34 |
+---------------------+---------------------+
3 rows in set (0.00 sec)
年,默认4位,如果写2位,会自动补全
mysql> insert into test7(party) values(191223112634);
Query OK, 1 row affected (0.12 sec)
mysql> select * from test7;
+---------------------+---------------------+
| meeting | party |
+---------------------+---------------------+
| 2023-05-06 16:15:42 | 2023-05-06 16:15:42 |
| 2021-12-23 11:26:34 | NULL |
| NULL | 2021-12-23 11:26:34 |
| NULL | 2019-12-23 11:26:34 |
+---------------------+---------------------+
8 rows in set (0.01 sec)
mysql> insert into test6(name,start) values("susi",15),("lisi",89);
Query OK, 2 rows affected (0.08 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from test6;
+------+-------+----------+------------+---------------------+
| name | start | up_class | birthday | party |
+------+-------+----------+------------+---------------------+
| bob | 1997 | 09:00:00 | 2021-05-16 | 2021-07-16 20:30:00 |
| bob | 1999 | 09:00:00 | 2021-05-16 | 2023-05-06 15:29:15 |
| bob | 2004 | 15:30:53 | 2023-05-06 | 2023-05-06 15:30:53 |
| tom | 2023 | 15:37:04 | 2023-05-06 | 2023-05-06 15:37:04 |
| tom | 2023 | 16:07:36 | 2023-05-06 | 2023-05-06 16:07:36 |
| susi | 2015 | NULL | NULL | NULL |
| lisi | 1989 | NULL | NULL | NULL |
+------+-------+----------+------------+---------------------+
7 rows in set (0.00 sec)
枚举类型(让表头的值在列举的范围里选)
单选:enum(值列表)
多选:set(值列表)
mysql> create table test8 (name char(5),likes set('eat','game','film','music'), sex enum('boy','girl','unknow'));
Query OK, 0 rows affected (0.56 sec)
mysql> desc test8;
+-------+----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------------------------------+------+-----+---------+-------+
| name | char(5) | YES | | NULL | |
| likes | set('eat','game','film','music') | YES | | NULL | |
| sex | enum('boy','girl','unknow') | YES | | NULL | |
+-------+----------------------------------+------+-----+---------+-------+
3 rows in set (0.02 sec)