数据类型
数据长什么样
数据需要多少空间存放
数据类型分类
系统内置数据类型
用户自定义数据类型
MySQL支持的数据类型
- 数据类型
- 字符串(字符)类型
- 日期/时间类型
正确选择数据类型对于获得高性能至关重要,三大原则
- 更小的通常更好,尽量使用可正确存储数据的最小数据类型
- 简单就好,简单数据类型的操作通常需要更少的CPU周期
- 尽量避免
NULL
,包含为NULL
的列,对MySQL更难优化
整数型
修饰符
适用所有类型的修饰符
NULL
数据列可包含NULL值(空值),默认值
NOT NULL
数据列不能包含NULL值(空值),类似必选项
DEFAULT
默认值,如果用户没有填写的话,适用默认值填入
PRIMARY KEY
主键,所有记录中此字段的值不能重复
,且不能为NULL
UNIQUE KEY
唯一键,非主键的,所有记录中此字段的值不能重复
,但可以为NULL
CHARACTER SET name
指定一个字符集
适用数值型的修饰符
AUTO_INCREMENT
自动递增,适用于整数类型
UNSIGNED
无符号(正数,不存在负数)
范例1:关于AUTO_INCREMENT
(root@localhost) [(none)]> SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
2 rows in set (0.00 sec)
-- auto_increment_increment 定义步长
-- auto_increment_offset 定义初始值
范例2:关于数据类型的空间区间的问题
-- 创建一个数据库db1,并创建一个t1表,字段为id,数据类型为init的,并且是正整数,自动增长,主键,初始值为4294967294
15:05:23 (root@localhost) [(none)]> CREATE DATABASE db1;
Query OK, 1 row affected (0.04 sec)
15:06:11 (root@localhost) [(none)]> USE db1;
Database changed
15:06:27 (root@localhost) [db1]> CREATE TABLE t1 (
-> id int UNSIGNED PRIMARY KEY AUTO_INCREMENT
-> ) AUTO_INCREMENT = 4294967294;
Query OK, 0 rows affected (0.16 sec)
15:07:10 (root@localhost) [db1]> SELECT * FROM t1;
Empty set (0.00 sec)
-- 当插入NULL空值的时候,因为此字段为主键,不能为NULL,所以就算填入NULL的时候,MySQL也会自动添加数据进入
15:07:19 (root@localhost) [db1]> INSERT INTO t1 VALUES (NULL);
Query OK, 1 row affected (0.03 sec)
15:07:45 (root@localhost) [db1]> SELECT * FROM t1;
+------------+
| id |
+------------+
| 4294967294 |
+------------+
1 row in set (0.00 sec)
15:07:48 (root@localhost) [db1]> INSERT INTO t1 VALUES (NULL);
Query OK, 1 row affected (0.02 sec)
15:07:50 (root@localhost) [db1]> SELECT * FROM t1;
+------------+
| id |
+------------+
| 4294967294 |
| 4294967295 |
+------------+
2 rows in set (0.00 sec)
15:07:52 (root@localhost) [db1]> INSERT INTO t1 VALUES (NULL);
ERROR 1062 (23000): Duplicate entry '4294967295' for key 'PRIMARY'
-- 因为init类型是占用了4个字节(4294967296),加之正整数从0开始计算,故可存储的最大数值为4294967295
-- 另如果是mariaDB的话,可能提示的报错为Out of range value for column 'id' at row 1