数据库系统原理与应用教程(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 类型,以节省存储空间并提高运行效率,尤其是当数据量非常大的情况下。
另外:要注意各种数据类型的特点以及使用限制。还要考虑各种存储引擎对数据类型的影响。