数据类型
# 整数类型
- TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 分别使用 8, 16, 24, 32, 64 位存储空间,一般情况下越小的列越好。
- INT(11) 中的数字只是规定了交互工具显示字符的个数,对于存储和计算来说是没有意义的。
# 浮点数
FLOAT 和 DOUBLE 为浮点类型,浮点类型因其精度的问题通常并不会被采用,除非一些必要设计。
<FieldName> float(<Number1>,<Number2>)
- Number1:总位数
- Number2:小数位数,如果位数超过了该位数就会四舍五入,就会导致数据不准确了。
Example:
创建一张 test
:
mysql> create table if not exists test(
-> number_1 float(3,1),
-> number_2 float(3,2)
-> );
1
2
3
4
2
3
4
插入若干数据:
mysql> insert into test values
-> (3.1,3.22),
-> (3.222,3.337777);
1
2
3
2
3
查询:
mysql> select * from test;
+----------+----------+
| number_1 | number_2 |
+----------+----------+
| 3.1 | 3.22 |
| 3.2 | 3.34 |
+----------+----------+
1
2
3
4
5
6
7
2
3
4
5
6
7
可以看到查询结果已被四舍五入。
# 定点数
DECIMAL整数和小数部分分开存储。不会像浮点数一样产生精度丢失。
- FLOAT 和 DOUBLE 为浮点类型,DECIMAL 为高精度小数类型。
- CPU 原生不支持 DECIMAl 类型的计算,因此 DECIMAL 的计算代价更高。
- FLOAT、DOUBLE 和 DECIMAL 都可以指定列宽,例如 DECIMAL(18, 9) 表示总共 18 位,取 9 位存储小数部分,剩下 9 位存储整数部分。
# 字符串
# CHAR
- CHAR 定长,末尾空格删除。
- 使用场景:短字符串;定长字符串;经常变更的数据
# VARCHAR
- VARCHAR 变长,末尾空格保留,
- VARCHAR 在 UPDATE 时若比原来更长,需要做额外的工作。MyISAM 拆数据,InnoDB 分裂页。
- 使用场景:最大长度比平均长度大很多;更新很少;复杂字符集
# BLOB 和 TEXT
BLOB 和 TEXT 都是为了存储很大的数据而设计的字符串数据类型
- BLOB:二进制存储
- TEXT:字符串存储
尽量避免使用 BLOB 和 TEXT 类型
# 布尔 boolean
mysql> create table if not exists test_5(
-> value_1 boolean,
-> value_2 boolean
-> );
1
2
3
4
2
3
4
mysql> insert into test_5 values(true,false);
1
mysql> select * from test_5;
+---------+---------+
| value_1 | value_2 |
+---------+---------+
| 1 | 0 |
+---------+---------+
1
2
3
4
5
6
2
3
4
5
6
# 枚举 enum
枚举类型从给定的选项中选取一个。
mysql> create table if not exists test_5(
-> gender enmu('male','female','?','nothing')
-> );
1
2
3
2
3
mysql> insert into test_6 values('male'),('female'),('?'),('nothing');
1
mysql> select * from test_6;
+---------+
| gender |
+---------+
| male |
| female |
| ? |
| nothing |
+---------+
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
枚举类型的另类存储方式(节省空间):
mysql> insert into test_6 values(1),(2);
1
1
代表“male”,2
代表“female”
mysql> select * from test_6;
+---------+
| gender |
+---------+
| male |
| female |
| ? |
| nothing |
| male |
| female |
+---------+
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 集合 set
枚举类型从给定的选项中选取多个。多个选项用逗号隔开,放在一对引号内。
mysql> create table if not exists test_7(
-> interested set('文学','哲学','IT','教育','数学','MBA','经济')
-> );
1
2
3
2
3
mysql> insert into test_7 values
-> ('哲学,IT,教育'),
-> ('经济,数学'),
-> ('MBA');
1
2
3
4
2
3
4
mysql> select * from test_7;
+--------------+
| interested |
+--------------+
| 哲学,IT,教育 |
| 数学,经济 |
| MBA |
+--------------+
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 时间日期 time、date
行业内规定,每一张表都应该有一个时间/日期的字段。你这个数据是什么时候插入的,什么时候更新的...(当然这个时间通常是用程序来插入)
DATE、TIME、YEAR、DATETIME、TIMESTAMP
实际应用中普遍使用DATETIME
mysql> create table if not exists test_8(`time` datetime);
1
mysql> insert into test_8 values ('2022-04-08 16:18:59');
1
mysql> select * from test_8;
+---------------------+
| time |
+---------------------+
| 2022-04-08 16:18:59 |
+---------------------+
1
2
3
4
5
6
2
3
4
5
6
编辑 (opens new window)
上次更新: 2022/09/26, 16:55:15