数据库系统原理与应用教程(022)—— MySQL 支持的数据类型总结


目录

  • 数据库系统原理与应用教程(022)—— MySQL 支持的数据类型总结
  • 一、数值型数据
  • 1、整型
  • 2、浮点数类型
  • 3、定点数类型
  • 二、字符类型
  • 1、CHAR 和 VARCHAR 类型
  • 2、BINARY 和 VARBINARY 类型
  • 3、BLOB 和 TEXT 类型
  • 4、ENUM(枚举)和SET(集合)类型
  • (1)ENUM(枚举)类型:
  • (2)SET(集合)类型
  • 三、日期时间类型
  • 四、数据类型选择的基本原则


创建数据表时,需要为表中的列指定适当的数据类型。MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串类型。

一、数值型数据

数值类型分为整型、定点数类型、浮点数类型。

1、整型

整型包括 TINYINT、SMALLINT、MEDIUMINT、 INT、 BIGINT 等类型。具体用法如下表所示:

MySQL数据类型

含义

tinyint(m)

长度 1 个字节,取值范围:-128~127

smallint(m)

长度 2 个字节,取值范围:-32768~32767

mediumint(m)

长度 3 个字节,取值范围:-8388608~8388607

int(m)

长度 4 个字节,取值范围:-2147483648~2147483647

bigint(m)

长度 8 个字节,取值范围:-9.22×1018—9.22×1018

说明:

(1)可以使用 unsigned 修饰符定义无符号整型,如 tinyint unsigned 的取值范围为(0~256)。

(2)int(m) 中的 m 表示查询结果中的显示宽度,并不影响实际的取值范围。

例如:

mysql> create table t12(id int(15) primary key,name char(20));
Query OK, 0 rows affected (0.25 sec)

mysql> insert into t12 values(1001,'Jack'),(200101,'Mark'),(302321411,'Tom');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t12;
+-----------+------+
| id        | name |
+-----------+------+
|      1001 | Jack |
|    200101 | Mark |
| 302321411 | Tom  |
+-----------+------+
3 rows in set (0.00 sec)

-- 定义 int(5) 并不影响 int 的取值范围。
mysql> create table t11(id int(5) primary key,name char(20));
Query OK, 0 rows affected (0.24 sec)

mysql> insert into t11 values(1001,'Jack'),(200101,'Mark'),(302321411,'Tom');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t11;
+-----------+------+
| id        | name |
+-----------+------+
|      1001 | Jack |
|    200101 | Mark |
| 302321411 | Tom  |
+-----------+------+
3 rows in set (0.00 sec)

2、浮点数类型

浮点数类型包括 float 和 double 两类,具体使用方法如下表所示:

MySQL数据类型

含义

float(m,d)

单精度浮点型,8位精度(4字节),m表示总长度,d表示小数位数

double(m,d)

双精度浮点型,16位精度(8字节),m表示总长度,d表示小数位数

说明:如果把某个字段定义为 float(7,2),表示该字段保留 2 位小数,总长度为 7 位,即整数最大为 5 位。

(1)如果插入一个数 123.45678,实际数据库里存的是 123.46;

(2)如果插入一个数 12.123456,存储的是 12.12,如果插入 1200,存储的是 1200.00。

(3)如果整数部分超过 5 位,则发生错误。

例如:

mysql> create table t21(id int primary key, name char(20), salary float(7,2));
Query OK, 0 rows affected (0.11 sec)

mysql> insert into t21 values(1,'张鹏',5800);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t21;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | 张鹏   | 5800.00 |     -- 小数部分自动补 0
+----+--------+---------+
1 row in set (0.00 sec)

mysql> insert into t21 values(2,'李军',5628.258);
Query OK, 1 row affected (0.04 sec)

mysql> select * from t21;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | 张鹏   | 5800.00 |
|  2 | 李军   | 5628.26 |
+----+--------+---------+
2 rows in set (0.00 sec)

mysql> insert into t21 values(3,'张静',105628.258);  -- 错误(整数 6 位)
ERROR 1264 (22003): Out of range value for column 'salary' at row 1

3、定点数类型

浮点数类型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。 定点数类型为 decimal(m,d),m 和 d 的含义与浮点数类型完全相同。其中参数 m<65,d<30。

例如:

mysql> create table t22(id int primary key, name char(20), salary decimal(7,2));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t22 values(1,'张鹏',5800);
Query OK, 1 row affected (0.24 sec)

mysql> insert into t22 values(2,'李军',5628.258);
Query OK, 1 row affected, 1 warning (0.04 sec)

mysql> insert into t22 values(3,'张静',105628.258);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1

mysql> select * from t22;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | 张鹏   | 5800.00 |
|  2 | 李军   | 5628.26 |
+----+--------+---------+
2 rows in set (0.00 sec)

二、字符类型

字符串类型包括:CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 、SET 等类型。

1、CHAR 和 VARCHAR 类型

说明:

(1)语法格式为: CHAR(n), VARCHAR(n);

(2)CHAR 和 VARCHAR 类型需要指定长度,长度表示要保存的最大字符数。例如: CHAR(20) 表示最多可以保存 20 个字符。

(3)CHAR 类型的长度可以为 0 到255之间的任何值。当保存 CHAR 类型的值时,如果字符数少于指定的长度,则在右边填充空格以达到指定的长度。当检索 CHAR 类型的值时,尾部的空格被删除。所以,我们在存储 char 类型的值时,字符串结尾不能有空格,即使有,查询出来后也会被删除。

(4)VARCHAR 列中的值为可变长字符串,长度可以指定为 0 到 65535 之间的值。与 CHAR 类型相比, VARCHAR 类型的值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。 VARCHAR 类型的值如果需要存储的字符个数少于指定的长度,不在尾部填充空格。检索时尾部的空格仍保留。

(5)如果需要保存的字符串的长度超过了 CHAR 或 VARCHAR 列指定的长度,会出现错误。

(6)char 类型的字符串检索速度要比 varchar 类型的快。

例如:

mysql> create table t41(id int primary key, name char(3), gender char(1));
Query OK, 0 rows affected (0.07 sec)

mysql> insert into t41 values(1,'Tom','M');
Query OK, 1 row affected (0.04 sec)

mysql> select * from t41;
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  1 | Tom  | M      |
+----+------+--------+
1 row in set (0.00 sec)

mysql> insert into t41 values(1,'Jack','M'); -- 超过 3 个字符
ERROR 1406 (22001): Data too long for column 'name' at row 1

mysql> insert into t41 values(2,'张静静','女');
Query OK, 1 row affected (0.01 sec)

mysql> select * from t41;
+----+-----------+--------+
| id | name      | gender |
+----+-----------+--------+
|  1 | Tom       | M      |
|  2 | 张静静    | 女     |
+----+-----------+--------+
2 rows in set (0.00 sec)

mysql> insert into t41 values(3,'诸葛孔明','男');  -- 超过 3 个字符
ERROR 1406 (22001): Data too long for column 'name' at row 1

测试 char 和 varchar 是否自动添加空格:

mysql> create table t42(id int primary key, name char(10), dept_name varchar(200));
Query OK, 0 rows affected (0.12 sec)

mysql> insert into t42 values(1, '张静静  ', '财务部');
Query OK, 1 row affected (0.01 sec)

mysql> insert into t42 values(2, '刘涛 ', '财务部  ');
Query OK, 1 row affected (0.04 sec)

mysql> select id, concat('Name:',name,'11') name,
       concat('dept_name:',dept_name,'11') 
       from t42;
-- char 类型插入数据时会自动在结尾添加空格,但显示时会删除尾部空格
-- varchar 类型插入数据时不会自动在结尾添加空格,显示时也不删除空格
+----+------------------+-------------------------------------+
| id | name             | concat('dept_name:',dept_name,'11') |
+----+------------------+-------------------------------------+
|  1 | Name:张静静11    | dept_name:财务部11                  |
|  2 | Name:刘涛11      | dept_name:财务部  11                |
+----+------------------+-------------------------------------+
2 rows in set (0.00 sec)

2、BINARY 和 VARBINARY 类型

BINARY 和 VARBINARY 类型类似于 CHAR 和 VARCHAR 类型。不同的是,它们存储的是二进制串,因此没有字符集。当保存 BINARY 数据值时,在尾部填充 0x00(零)值以达到指定长度,取值时不删除尾部的字节。对于 VARBINARY,插入时不填充字符,选择时不裁剪字节。

BINARY 和 VARBINARY 类型的长度是字节数,而不是字符数。一个西文字符占用一个字节,汉字占用的字节数和字符集有关。可以使用 show character set 命令查询各字符集中汉字所用的字节数:

mysql> show character set;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.12 sec)

-- 字符集 utf8 每个汉字占用 3 个字节。

例如:

mysql> create table t51(id int primary key,name binary(12),addr varbinary(20));
Query OK, 0 rows affected (0.89 sec)

mysql> show create table t51\G
*************************** 1. row ***************************
       Table: t51
Create Table: CREATE TABLE `t51` (
  `id` int(11) NOT NULL,
  `name` binary(12) DEFAULT NULL,
  `addr` varbinary(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
-- 表 t51 使用的字符集为 utf8,则一个汉字占用 3 个字节。name 列最多保存 4 个汉字,addr 列最多保存 6 个汉字。

mysql> insert into t51 values(1, '张静静', '财务部');
Query OK, 1 row affected (0.05 sec)

mysql> select * from t51;
+----+--------------+-----------+
| id | name         | addr      |
+----+--------------+-----------+
|  1 | 张静静       | 财务部    |
+----+--------------+-----------+
1 row in set (0.03 sec)

mysql> insert into t51 values(2, '张静静2', '财务部');
Query OK, 1 row affected (0.02 sec)

mysql> insert into t51 values(3, '刘涛 ', '财务部  ');
Query OK, 1 row affected (0.01 sec)

-- 插入失败,name 列超过了指定长度
mysql> insert into t51 values(4, '诸葛孔明1', '财务部  ');
ERROR 1406 (22001): Data too long for column 'name' at row 1

mysql> select * from t51;
+----+--------------+-------------+
| id | name         | addr        |
+----+--------------+-------------+
|  1 | 张静静       | 财务部      |
|  2 | 张静静2      | 财务部      |
|  3 | 刘涛         | 财务部      |
+----+--------------+-------------+
3 rows in set (0.05 sec)

mysql> select id,concat('name:',name,'11') name,concat('addr:',addr,'11') addr from t51;
+----+---------------------+--------------------+
| id | name                | addr               |
+----+---------------------+--------------------+
|  1 | name:张静静   11    | addr:财务部11      |  --张静静后面有3个空格
|  2 | name:张静静2  11    | addr:财务部11      |  --张静静2后面有2个空格
|  3 | name:刘涛      11   | addr:财务部  11    |  --刘涛后面有6个空格
+----+---------------------+--------------------+
3 rows in set (0.00 sec)

3、BLOB 和 TEXT 类型

(1)BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和LONGBLOB。这四种类型的用法完全相同,区别仅仅在于可容纳值的最大长度不同。

(2)TEXT 类型有 4 种:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。

(3)BLOB 列可以被看作二进制字符串,TEXT 列可以被看作字符字符串,类似 CHAR 和 BINARY。可以将 BLOB 列看作足够大的 VARBINARY 列。

(4)可以将 TEXT 列看作足够大的 VARCHAR列。

例如:

mysql> create table t61(id int primary key, name char(4), memo blob);
Query OK, 0 rows affected (0.57 sec)

mysql> insert into t61 values(1, '诸葛孔明', '一个智慧的人!  ');
Query OK, 1 row affected (0.24 sec)

mysql> select * from t61;
+----+--------------+-------------------------+
| id | name         | memo                    |
+----+--------------+-------------------------+
|  1 | 诸葛孔明     | 一个智慧的人!          |
+----+--------------+-------------------------+
1 row in set (0.00 sec)

mysql> select id,name,concat(memo,'11') memo from t61;
+----+--------------+---------------------------+
| id | name         | memo                      |
+----+--------------+---------------------------+
|  1 | 诸葛孔明     | 一个智慧的人!  11        |
+----+--------------+---------------------------+
1 row in set (0.00 sec)

mysql> create table t62(id int primary key, name char(4), memo text);
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t62 values(1, '诸葛孔明', '一个智慧的人!');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t62;
+----+--------------+-----------------------+
| id | name         | memo                  |
+----+--------------+-----------------------+
|  1 | 诸葛孔明     | 一个智慧的人!        |
+----+--------------+-----------------------+
1 row in set (0.00 sec)

mysql> select id,name,concat(memo,'11') memo from t62;
+----+--------------+-------------------------+
| id | name         | memo                    |
+----+--------------+-------------------------+
|  1 | 诸葛孔明     | 一个智慧的人!11        |
+----+--------------+-------------------------+
1 row in set (0.00 sec)

4、ENUM(枚举)和SET(集合)类型

(1)ENUM(枚举)类型:

说明:

① MySQL 中的 ENUM(枚举) 类型是一个字符串对象,其值来自创建表时在列规定中显式枚举的值。

② 插入数据时只能从枚举列表中选择一个选项插入,不能同时插入多个选项,这是和 SET 类型的最大区别。

③ 可以插入NULL。

④ ENUM(枚举)类型的索引规则如下:对各个枚举值从1开始依次编号, ENUM 值根据索引编号进行排序。例如:对于ENUM(‘a’,‘b’),'a’排在’b’前面,但对于ENUM(‘b’,‘a’),'b’排在’a’前面。

例如:

/*
create table t71(
    id int primary key,
    name char(20),
    gender enum('男','女'), 
    dept_name enum('销售部','财务部','生产部','公关部','人事部')
);
*/
mysql> create table t71(
    ->     id int primary key,
    ->     name char(20),
    ->     gender enum('男','女'), 
    ->     dept_name enum('销售部','财务部','生产部','公关部','人事部')
    -> );
Query OK, 0 rows affected (0.14 sec)

mysql> insert into t71 values(1,'张涛','男','财务部');
Query OK, 1 row affected (0.04 sec)

mysql> insert into t71 values(2,'张静静','女','销售部');
Query OK, 1 row affected (0.10 sec)

-- 枚举类型可以插入空值
mysql> insert into t71 values(3,'张彭辉',null,'销售部');
Query OK, 1 row affected (0.01 sec)

-- 插入失败
mysql> insert into t71 values(4,'周瑜','男','销售部1');
ERROR 1265 (01000): Data truncated for column 'dept_name' at row 1

mysql> insert into t71 values(5,'张学有','男','财务部'),(6,'周华建','男','销售部'),(7,'周润发','男','生产部'),    
-> (8,'赵紫龙','女','人事部'),(9,'周杰伦','男','公关部'),(10,'张扬','女','人事部');
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

-- 按 dept_name 列排序
mysql> select * from t71 order by dept_name;
+----+-----------+--------+-----------+
| id | name      | gender | dept_name |
+----+-----------+--------+-----------+
|  2 | 张静静    | 女     | 销售部    |
|  3 | 张彭辉    | NULL   | 销售部    |
|  6 | 周华建    | 男     | 销售部    |
|  1 | 张涛      | 男     | 财务部    |
|  5 | 张学有    | 男     | 财务部    |
|  7 | 周润发    | 男     | 生产部    |
|  9 | 周杰伦    | 男     | 公关部    |
|  8 | 赵紫龙    | 女     | 人事部    |
| 10 | 张扬      | 女     | 人事部    |
+----+-----------+--------+-----------+
9 rows in set (0.05 sec)

(2)SET(集合)类型

说明:

① SET 类型定义时的语法和 ENUM 类型完全相同。使用时的唯一区别在于插入数据时 ENUM 类型只能选择一个选项插入,而 SET 类型可以插入多个选项。

② SET 是一个字符串对象,可以有零个或多个值,其值来自创建表时在列规定中设置的选项。

③ SET 类型最多可以设置64个值。

④ 对于包含多个 SET 元素的值,当插入值时元素所列的顺序并不重要。

例如:

/*
create table user_permission(
    id int UNSIGNED not null auto_increment primary key,
    user_id int not null,
    permission set('阅读','评论','发帖') not null,
    unique (user_id)
);
*/

mysql> create table user_permission(
    ->     id int UNSIGNED not null auto_increment primary key,
    ->     user_id int not null,
    ->     permission set('阅读','评论','发帖') not null,
    ->     unique (user_id)
    -> );
Query OK, 0 rows affected (0.22 sec)

mysql> insert into user_permission(user_id,permission) values (1,'阅读'),(2,'阅读'),(3,'阅读,评论'),(4,'阅 
读,评论,发帖');Query OK, 4 rows affected (0.06 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from user_permission;
+----+---------+----------------------+
| id | user_id | permission           |
+----+---------+----------------------+
|  1 |       1 | 阅读                 |
|  2 |       2 | 阅读                 |
|  3 |       3 | 阅读,评论            |
|  4 |       4 | 阅读,评论,发帖       |
+----+---------+----------------------+
4 rows in set (0.00 sec)

SET(集合)类型的查询:集合中第一个选项的编号为1,第二个为2,第三个为4,第四个为8,以此类推。因此查询集合类型的列时可以使用集合的编号构造条件。比如针对上面的表 user_permission,如果需要针对 permission 列进行查询,可以采用以下方法构造查询条件:

(1)查询包含第一项的条件为:permission = 1

(2)查询包含第一项和第二项的条件为:permission = 3(1+2)

(3)查询包含第二项和第三项的条件为:permission = 6(2+4)

(4)查询包含第一项和第三项的条件为:permission = 5(1+4)

(5)查询包含前三项的条件为:permission = 7(1+2+4)

例如:

-- 查询 permission 列包含“阅读”的数据
mysql> select * from user_permission where permission = 1;
+----+---------+------------+
| id | user_id | permission |
+----+---------+------------+
|  1 |       1 | 阅读       |
|  2 |       2 | 阅读       |
+----+---------+------------+
2 rows in set (0.24 sec)

-- 查询 permission 列包含“阅读”和“评论”的数据
mysql> select * from user_permission where permission = 3;
+----+---------+---------------+
| id | user_id | permission    |
+----+---------+---------------+
|  3 |       3 | 阅读,评论     |
+----+---------+---------------+
1 row in set (0.00 sec)

-- 查询 permission 列包含“阅读”、“评论”和“发帖”的数据
mysql> select * from user_permission where permission = 7;
+----+---------+----------------------+
| id | user_id | permission           |
+----+---------+----------------------+
|  4 |       4 | 阅读,评论,发帖       |
+----+---------+----------------------+
1 row in set (0.00 sec)

-- 查询 permission 列包含“评论”和“发帖”的数据
mysql> select * from user_permission where permission = 6;
Empty set (0.00 sec)

三、日期时间类型

日期时间类型包括:Date、DateTime、TimeStamp、Time、Year

MySQL数据类型

含义

date

日期: ‘2008-12-2’,只需要日期值而不需要时间部分时应使用此类型。

time

时间: ‘12:25:36’

datetime

日期时间: ‘2008-12-2 22:06:44’,需要同时包含日期和时间信息的值时使用此类型。

timestamp

时间戳:自动存储记录修改时间

说明:输入日期和时间类型的数据时必须用单引号括起来。必须是一个合法的日期和时间,否则会出错。

例如:

mysql> create table t81(id int primary key, name char(20),birth datetime);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t81 values(1,'张涛','1998-1-23 8:12:50');
Query OK, 1 row affected (0.00 sec)

-- 不指定时间
mysql> insert into t81 values(2,'刘刚','1995-10-3');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t81;
+----+--------+---------------------+
| id | name   | birth               |
+----+--------+---------------------+
|  1 | 张涛   | 1998-01-23 08:12:50 |
|  2 | 刘刚   | 1995-10-03 00:00:00 |
+----+--------+---------------------+
2 rows in set (0.00 sec)

-- 非法的日期或时间
mysql> insert into t81 values(3,'刘晶晶','1995-13-3');
ERROR 1292 (22007): Incorrect datetime value: '1995-13-3' for column 'birth' at row 1
mysql> insert into t81 values(3,'刘晶晶','1995-10-3 88:88:88');
ERROR 1292 (22007): Incorrect datetime value: '1995-10-3 88:88:88' for column 'birth' at row 1

可以为日期和时间指定默认值,例如:

create table t82(id int primary key,name char(20),createtime datetime default now());

mysql> insert into t82(id,name) values(1,'Jack');
Query OK, 1 row affected (0.02 sec)

mysql> select * from t82;
+----+------+---------------------+
| id | name | createtime          |
+----+------+---------------------+
|  1 | Jack | 2022-07-16 12:54:43 |
+----+------+---------------------+
1 row in set (0.01 sec)

四、数据类型选择的基本原则

在满足使用需求的前提下,采用从小原则(即尽量采用占用存储空间小的数据类型),比如能用 TINYINT 时最好不用 INT,能用 FLOAT 类型的就不用 DOUBLE 类型,以节省存储空间并提高运行效率,尤其是当数据量非常大的情况下。

另外:要注意各种数据类型的特点以及使用限制。还要考虑各种存储引擎对数据类型的影响。