Mysql数据类型

本文深入解析MySQL中的数据类型,包括数值型、字符串、日期和时间类型。探讨了各种类型的使用场景,如整数、浮点数、zerofill、日期、时间戳、字符串、char、varchar、binary、enum和set等。

Mysql数据类型

Mysql提供了多种数据类型,主要有数值型、字符串类型、日期和时间类型。不同的Mysql版本可能支持的数据类型可能会不同。

create database mysqlstu charset=utf8;
grant all privileges on mysqlstu.*  to chengdu@localhost;

数值类型

数值类型分为整数类型、浮点数类型、定点数类型、位类型。对于整数类型数据,MySQL支持在类型名称后面的小括号内指定显示宽度,如果不显示指定宽度则默认为int(11)。

整数类型

mysql> use mysqlstu;
Database changed
mysql> show tables;
Empty set (0.01 sec)

mysql> create table intdata (
    -> field1 tinyint,
    -> field2 smallint,
    -> field3 mediumint,
    -> field4 int,
    -> field5 bigint ) charset=utf8;
Query OK, 0 rows affected, 1 warning (0.18 sec)

mysql> desc intdata;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| field1 | tinyint(4)   | YES  |     | NULL    |       |
| field2 | smallint(6)  | YES  |     | NULL    |       |
| field3 | mediumint(9) | YES  |     | NULL    |       |
| field4 | int(11)      | YES  |     | NULL    |       |
| field5 | bigint(20)   | YES  |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+
5 rows in set (0.06 sec)

mysql> insert into intdata(field1, field2, field3, field4, field5) values(-128,
-32768, -8388608, -2147483648,-9223372036854775808);
Query OK, 1 row affected (0.12 sec)

mysql> select * from intdata;
+--------+--------+----------+-------------+----------------------+
| field1 | field2 | field3   | field4      | field5               |
+--------+--------+----------+-------------+----------------------+
|   -128 | -32768 | -8388608 | -2147483648 | -9223372036854775808 |
+--------+--------+----------+-------------+----------------------+
1 row in set (0.00 sec)

mysql> insert into intdata(field1, field2, field3, field4, field5) values(-129,
-32768, -8388608, -2147483648,-9223372036854775808);
ERROR 1264 (22003): Out of range value for column 'field1' at row 1

mysql> insert into intdata(field1, field2, field3, field4, field5) values(127, 3
2767, 8388607, 2147483647, 9223372036854775807);
Query OK, 1 row affected (0.06 sec)

mysql> select * from intdata;
+--------+--------+----------+-------------+----------------------+
| field1 | field2 | field3   | field4      | field5               |
+--------+--------+----------+-------------+----------------------+
|   -128 | -32768 | -8388608 | -2147483648 | -9223372036854775808 |
|    127 |  32767 |  8388607 |  2147483647 |  9223372036854775807 |
+--------+--------+----------+-------------+----------------------+
2 rows in set (0.00 sec)

mysql> insert into intdata(field1, field2, field3, field4, field5) values(128, 3
2767, 8388607, 2147483647, 9223372036854775807);
ERROR 1264 (22003): Out of range value for column 'field1' at row 1

浮点数类型

mysql> create table floatdata (
    -> field1 float(6,2),
    -> field2 double(7,3)) charset=utf8;
Query OK, 0 rows affected, 1 warning (0.08 sec)

mysql> desc floatdata;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| field1 | float(6,2)  | YES  |     | NULL    |       |
| field2 | double(7,3) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

zerofill

mysql> create table zerofilltable (
    -> field1 int ) charset=utf8;
Query OK, 0 rows affected, 1 warning (0.06 sec)

mysql> insert into zerofilltable(field1) values(2);
Query OK, 1 row affected (0.08 sec)

mysql> select * from zerofilltable;
+--------+
| field1 |
+--------+
|      2 |
+--------+

mysql> alter table zerofilltable modify field1 int zerofill;
Query OK, 1 row affected (0.22 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> select * from zerofilltable;
+------------+
| field1     |
+------------+
| 0000000002 |
+------------+
1 row in set (0.00 sec)


日期和时间类型

MySQL中有多种数据类型可以用于表示时间
如果要用来表示年月日,通常用DATE来表示
如果要用来表示年月日时分秒,通常用DATETIME表示
如果只用来表示时分秒,通常用TIME表示

mysql> create table datetype (
    -> field1 date,
    -> field2 datetime,
    -> field3 timestamp,
    -> field4 time,
    -> field5 year ) charset=utf8;
Query OK, 0 rows affected, 1 warning (0.07 sec)

mysql> desc datetype
    -> ;
+--------+-----------+------+-----+---------+-------+
| Field  | Type      | Null | Key | Default | Extra |
+--------+-----------+------+-----+---------+-------+
| field1 | date      | YES  |     | NULL    |       |
| field2 | datetime  | YES  |     | NULL    |       |
| field3 | timestamp | YES  |     | NULL    |       |
| field4 | time      | YES  |     | NULL    |       |
| field5 | year(4)   | YES  |     | NULL    |       |
+--------+-----------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2018-11-23 08:59:07 |
+---------------------+
1 row in set (0.00 sec)

mysql> insert into datetype(field1,field2,field3,field4,field5) values(now(),now(), now(), now(), now());
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;
+-------+------+----------------------------------------------------------------
----------+
| Level | Code | Message
          |
+-------+------+----------------------------------------------------------------
----------+
| Note  | 1292 | Incorrect date value: '2018-11-23 09:00:20' for column 'field1'
 at row 1 |
+-------+------+----------------------------------------------------------------
----------+
1 row in set (0.00 sec)

mysql> select * from datetype;
+------------+---------------------+---------------------+----------+--------+
| field1     | field2              | field3              | field4   | field5 |
+------------+---------------------+---------------------+----------+--------+
| 2018-11-23 | 2018-11-23 09:00:20 | 2018-11-23 09:00:20 | 09:00:20 |   2018 |
+------------+---------------------+---------------------+----------+--------+
1 row in set (0.00 sec)

TIMESTAMP 和时区相关,当插入日期的时,会先转换为本地时区后存放,而从数据库里面取出来时候,也需要将日期转换为本地时区后显示。

mysql> show warnings;
+---------+------+--------------------------------------------------------------
--------------------------------------------------------------------------------
-------------------------------+
| Level   | Code | Message

                               |
+---------+------+--------------------------------------------------------------
--------------------------------------------------------------------------------
-------------------------------+
| Warning | 3719 | 'utf8' is currently an alias for the character set UTF8MB3, b
ut will be an alias for UTF8MB4 in a future release. Please consider using UTF8M
B4 in order to be unambiguous. |
+---------+------+--------------------------------------------------------------
--------------------------------------------------------------------------------
-------------------------------+
1 row in set (0.00 sec)

mysql> create table timestamptest (
    -> field1 timestamp default current_timestamp,
    -> field2 datetime ) charset=utf8mb4;
Query OK, 0 rows affected (0.08 sec)

mysql> desc timestamptest;
+--------+-----------+------+-----+-------------------+-------+
| Field  | Type      | Null | Key | Default           | Extra |
+--------+-----------+------+-----+-------------------+-------+
| field1 | timestamp | YES  |     | CURRENT_TIMESTAMP |       |
| field2 | datetime  | YES  |     | NULL              |       |
+--------+-----------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)

mysql> insert into timestamptest(field1, field2) values(now(), now());
Query OK, 1 row affected (0.10 sec)

mysql> select * from timestamptest;
+---------------------+---------------------+
| field1              | field2              |
+---------------------+---------------------+
| 2018-11-23 09:35:29 | 2018-11-23 09:35:29 |
+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+
1 row in set, 1 warning (0.00 sec)

mysql> set time_zone='+9:00';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | +09:00 |
+---------------+--------+
1 row in set, 1 warning (0.00 sec)

mysql> select * from timestamptest;
+---------------------+---------------------+
| field1              | field2              |
+---------------------+---------------------+
| 2018-11-23 10:35:29 | 2018-11-23 09:35:29 |
+---------------------+---------------------+
1 row in set (0.00 sec)

TIMESTAMP支持的时间范围比较小, DATETIME支持的时间范围大
TIMESTAMP 插入和查询都受当地的时区影响,DATETIME 只能反映出插入时当地的时区

字符串类型

MySQL中提供了多种对字符数据的存储类型,不同版本可能有所差异。字符串类型有char、varchar、binary、varbinary、blob、text、enum、set等多种字符串类型。

CHAR和CARCHAR类型

char和varchar用来保存比较短的字符串。char固定长度,varchar列中的值为可变长字符串

mysql> create table cv(
    -> field1 char(5),
    -> field2 varchar(5)) charset=utf8;
Query OK, 0 rows affected, 1 warning (0.04 sec)

mysql> insert into cv(field1, field2) values('1234 ','1234 ');
Query OK, 1 row affected (0.04 sec)

mysql> select * from cv;
+--------+--------+
| field1 | field2 |
+--------+--------+
| 1234   | 1234   |
+--------+--------+
1 row in set (0.00 sec)

mysql> select length(field1), length(field2) from cv;
+----------------+----------------+
| length(field1) | length(field2) |
+----------------+----------------+
|              4 |              5 |
+----------------+----------------+
1 row in set (0.00 sec)

mysql> insert into cv(field1, field2) values('abcdef','abcdef');
ERROR 1406 (22001): Data too long for column 'field1' at row 1

mysql> insert into cv(field1, field2) values('abcde','abcdef');
ERROR 1406 (22001): Data too long for column 'field2' at row 1
mysql> insert into cv(field1, field2) values('abcde','abcde');
Query OK, 1 row affected (0.09 sec)


在检索的时候,char列删除了尾部的空格,而varchar则保留了这些空格。

char、varchar需要指定长度

BINARY 和 VARBINARY

binary和varbinary包含二进制字符串而不包含非二进制字符串

mysql> create table binarytest (
    -> field1 binary(5),
    -> field2 varbinary(5)) charset=utf8;
Query OK, 0 rows affected, 1 warning (0.10 sec)

mysql> insert into binarytest(field1, field2) values('1','1');
Query OK, 1 row affected (0.03 sec)

mysql> select *,field1='1',field1='1\0\0\0\0' from binarytest;
+--------+--------+------------+--------------------+
| field1 | field2 | field1='1' | field1='1\0\0\0\0' |
+--------+--------+------------+--------------------+
| 1      | 1      |          0 |                  1 |
+--------+--------+------------+--------------------+
1 row in set (0.00 sec)

当保存BINARY值时,在值的最后面填充"0x00"(零字节)达到指定的字段定义长度。

ENUM 类型

mysql> create table enumtest (
    -> language enum('Java', 'Python', 'C++', 'C')) charset=utf8;
Query OK, 0 rows affected, 1 warning (0.09 sec)

mysql> show warnings;
+---------+------+--------------------------------------------------------------
--------------------------------------------------------------------------------
-------------------------------+
| Level   | Code | Message

                               |
+---------+------+--------------------------------------------------------------
--------------------------------------------------------------------------------
-------------------------------+
| Warning | 3719 | 'utf8' is currently an alias for the character set UTF8MB3, b
ut will be an alias for UTF8MB4 in a future release. Please consider using UTF8M
B4 in order to be unambiguous. |
+---------+------+--------------------------------------------------------------
--------------------------------------------------------------------------------
-------------------------------+
1 row in set (0.00 sec)

mysql> insert into enumtest(language) values('1'),('3'),(2);
Query OK, 3 rows affected (0.11 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from enumtest;
+----------+
| language |
+----------+
| Java     |
| C++      |
| Python   |
+----------+
3 rows in set (0.00 sec)

mysql> desc enumtest;
+----------+---------------------------------+------+-----+---------+-------+
| Field    | Type                            | Null | Key | Default | Extra |
+----------+---------------------------------+------+-----+---------+-------+
| language | enum('Java','Python','C++','C') | YES  |     | NULL    |       |
+----------+---------------------------------+------+-----+---------+-------+

set类型

set是一个集合,类似于Java语言集合,mysql用set作为字段时,该数据字段无重复元素


mysql> create table settest (
    -> filed1 set('a','b','c','d') ) charset=utf8mb4;
Query OK, 0 rows affected (0.10 sec)

mysql> insert into settest(field1) values('a,e');
ERROR 1265 (01000): Data truncated for column 'field1' at row 1
mysql> insert into settest(field1) values('a,b');
Query OK, 1 row affected (0.06 sec)

mysql> insert into settest(field1) values('a,b'),('a,b,c,a');
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from settest;
+--------+
| field1 |
+--------+
| a,b    |
| a,b    |
| a,b,c  |
+--------+
3 rows in set (0.00 sec)

在建表的时候,可以根据相应的特点来选择合适的数据类型,了解更详细内容阅读书籍《深入浅出MySQL++数据库开发、优化与管理维护》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chengdu.S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值