[MySQL | 二、基本数据类型]
基本数据类型
- 一、数值类型
- 举例表结构
- 1. 整数类型
- zerofill属性 与 int(n) 中 n 的关系
- 2.bit类型
- 3. 小数类型
- float类型
- decimal类型
- 二、字符串类型
- 1. char
- 2. varchar
- 如何选择定长或变长字符串?
- 3. 日期时间类型(date datetime timestamp)
- 4. enum枚举类型
- 5. set多选类型
一、数值类型
举例表结构
字段名称 | 字段类型 | 是否NULL | 键值 | 默认值 | 附加信息 |
---|---|---|---|---|---|
Field | Type | Null | Key | Default | Extra |
id | int | No | UNI(唯一键) | Null | auto_increment |
name | verchar(10) | No | PRI(主键) | Null | |
gender | enum | No | man | ||
age | tinyint | Yes | Null | ||
telphone | int | Yes | Null | ||
home_id | int | yes | MUL(外键) | Null |
1. 整数类型
类型 | 字节 | 数值范围(带符号) | 不带符号 |
---|---|---|---|
tinyint | 1 | -128 ~ 127 | 0 ~ 255 |
smallint | 2 | -32768 ~ 32767 | 0 ~ 65535 |
mediumint | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
int | 4 | -2147483648 ~ 2147483647 | 0 ~ 4294967295 |
bigint | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 2^(8 * 8) - 1 |
- 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
- 可以通过
unsigned
来说明某个字段是无符号的 - 无符号案例
mysql> create table tt2(num tinyint unsigned);
mysql> insert into tt2 values(-1); -- 无符号,范围是: 0 - 255
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into tt2 values(255);
Query OK, 1 row affected (0.02 sec)
mysql> select * from tt2;
+------+
| num |
+------+
| 255 |
+------+
1 row in set (0.00 sec)
zerofill属性 与 int(n) 中 n 的关系
-
int(n) 中的 n 为显示宽度,只有当它与 zerofill 属性配合时才会显现它的作用
-
在创建表结构时,如果创建int类型字段且没有设置宽度mysql默认显示宽度为11位,有个符号位。
-
添加zerofill属性时,该列会自动变成无符号整型(unsigned)且默认显示宽度为10位。这是因为zerofill的主要目的是为了在显示数字时,在左边填充零以达到指定的显示宽度,而对于负数,这种填充零的操作没有意义。
示例没有zerofill属性:
mysql> create table t1( -> id int -> ); ) Query OK, 0 rows affected (0.00 sec) mysql> insert into t1 values(10); #插入一条数据 mysql> insert into t1 values(1); #插入一条数据 Query OK, 1 row affected (0.00 sec) mysql> select * from t1; +------+ | id | +------+ | 10 | +------+ | 1 | +------+
示例有zerofill属性:
mysql> create table t1( -> id int zerofill -> ); ) Query OK, 0 rows affected (0.00 sec) mysql> insert into t1 values(10); #插入一条数据 mysql> insert into t1 values(1); #插入一条数据 Query OK, 1 row affected (0.00 sec) mysql> select * from t1; +---------------+ | id | +---------------+ | 0000000010 | +---------------+ | 0000000001 | +---------------+
2.bit类型
用法:bit(m)
——create table 表名 ( 字段名 bit(m));
位字段类型。M表示字段的bit位数,范围从1到64。如果M被忽略,默认为1。
介绍:
- bit字段在显示时,是按照ASCII码对应的值显示(如果在一个bit字段插入数字 65,查看时显示 A)
- 如果我们有这样的值,只存放0或1,这时可以定义bit(1)。这样可以节省空间
3. 小数类型
float类型
float[(m, d)] [unsigned]
: M指定显示长度,d指定小数位数,默认无符号。
例:
float(4,2) :无符号时范围是 -99.99 ~ 99.99 有符号时范围是 0 ~ 99.99
若插入一个数 99.985,四舍五入储存为99.99.
- 固定占用空间4个字节
- 有精度损失,float表示的精度大约是7位
- MySQL在保存指定小数位数以外的值时会进行四舍五入
decimal类型
decimal(m, d) [unsigned]
: m指定长度,d表示小数点的位数
- decimal类型精度更高
- decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10
建议:如果希望小数的精度高,推荐使用decimal
二、字符串类型
字符串类型 | 储存内容 | 占用字节 |
---|---|---|
char(4) | A | 4 * 3 = 12 |
varchar(4) | A | 1 * 3 + 1 = 4 |
char(4) | abcd | 4 * 3 = 12 |
varchar(4) | abcd | 4 * 3 + 1 = 13 |
char(4) | abcde | 报错,超出长度 |
varchar(4) | abcde | 报错,超出长度 |
1. char
char(L)
: 固定长度字符串,L是可以存储的固定的字符长度,最大长度值可以为255。
2. varchar
varchar(L)
: 可变长度字符串,L表示可储存的最大字符长度,最大长度65535个字节,可根据储存内容缩小储存大小。
说明:
关于varchar(L),L到底是多大,这个L值,和表的编码密切相关:
- varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
- 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大65532/2=32766(因为gbk中,一个字符占用2字节)。
如何选择定长或变长字符串?
- 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
- 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
- 定长的意义是,直接开辟好对应的空间。
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
3. 日期时间类型(date datetime timestamp)
常用的日期有如下三个:
date
:日期 ‘yyyy-mm-dd’ ,占用三字节datetime
时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节timestamp
:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和datetime
完全一致,占用四字节
4. enum枚举类型
用法:enum('选项1','选项2','选项3',...);
该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号
当在创建表结构中字段类型时选择enum类型并设置选项后,在此表中插入数据时只能从设置的选项中多选一。
5. set多选类型
用法:set('选项值1','选项值2','选项值3', ...);
该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,…
最多64个。
当在创建表结构中字段类型时选择enum类型并设置选项后,在此表中插入数据时可以从设置的选项中多选。
说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。