MySql常用数据类型(列类型)
数值型(整数)的基本使用
说明:在满足需求的情况下,尽量选择占用空间小的类型
类型 | 字节 | 最小值 | 最大值 |
(带符号的/无符号的) | (带符号的/无符号的) | ||
TINGINT | 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 | -2^63 | 2^63-1 |
0 | 2^64-1 |
实例:测试数据类型TINGINT的数据范围
可以观察到-129,128超出TINYINT数据类型所包含的数据范围
在实际应用中,为了节省内存,并且所输入的数据是正数,我们可以使用unsigned关键字使数据类型变成无符号数据类型,这样就可以输入更大的数据
此时可以发现数据库编辑系统并没有报错
使用select语句查询t4表的数据发现可以录入(超出数据范围录入不了)
此时就不可以输入负数(不在无符号数据类型范围内)
数值型(bit)的使用
1. 基本使用
mysql>create table t02 (num bit(8));
mysql>insert into t02(1,3);
mysql>intsert into t02 values(2,65);
2.细节说明
bit字段显示时,按照位的方式显示
查询的时候仍然可以使用添加的数据
如果一个值只有0,1可以考虑bit(1),可以节约空间
位类型,M指定位数,默认值1,范围1-64
数值型(小数)的基本使用
1. FLOAT/DOUBLE [UNSIGNED]
Float 单精度,Double 双精度
2. DECIMAL(M,D) [UNSIGNED]
- 可以支持更加精确的小数位。M是小数位数(精度)的总数,D是小数点(标度)后面的位数
- 如果D是0,则值没有小数点或分数部分。M最大65。D最大是30。如果D被省略, 默认是0。如果M被省略,默认是10
实例:
由图可知,向CC04中三个不同数据类型输入11.123456789123456789,观察三个不同数据类型对数据的保存情况,可知float,double数据类型进位制采用四舍五入进位制,并且decimal数据类型对多出来的位数进行补零填充
字符串的基本使用
CHAR(size)
固定长度字符串 最大255字符
VARCHAR(size)
可变长度字符串 最大65532字节【utf8编码最大21844字符 1-3个字节用于记录大小】
注:
根据不同的字符编码方式,相同字节所能输入的字符数不同
例:
在utf8编码方式下,varchar 字符串长度最大字节为 65535 但其中有三个字节用于记录数据大小,所以能输入的字符串字节数为65535 - 3 = 65532,在utf8字符编码方式下 一个字符站3个字节,所以最终可输入字节为 65532 / 3 = 21844个
例:
由图可知,当设置varchar数值长度为21845时,系统进行报错,原因是65535中三个字符用来记录数值大小,所以字符长度最大为21844
字符串使用细节
1. char(4)
// 这个4表示字符数量(最大255),不是字节数,不管是中文还是字母都是放四个,按字符计算
varchar(4)
// 这个4表示字符数,不管是字母还是中文都以定义好的表的编码来存放数据
注:根据如上所述,根据不同的字符编码(如utf8 一个字符占三个字节,gbk 一个字符占用2个字节)所占用的空间不同
2. char(4)是定长,即即使插入‘aa’,也会占用4个字符
varchar(4)是变长,即插入‘aa’,实际占用空间大小并不是4个字符而是按照实际占用空间来分配
// varchar本身还要占用1-3个字节来记录存放内容长度
3. char 和 varchar 的使用情况
// 如果数据是定长,推荐使用char,比如md5的密码,邮编,手机号,身份证号等
// 如果一个字段的长度是不确定的,使用varchar,比如留言、文章
查询速度:char > varchar
4. 在存放文本时,也可以使用Text数据类型,可以将Text列视为varchar列,注意Text不能有默认值,大小0-2^16字节
// mediumtext 2^24 longtext 2^36
日期类型的基本使用
如下图所示:对创建的表cc06的birthday,job_time 列插入相关数据,login_time 列不插入数据
#演示时间相关的数据类型
CREATE TABLE cc06(
birthday DATE,
job_time DATETIME,
-- 若希望 login_time 自动更新可进行相关设置
login_time TIMESTAMP
NOT NULL -- 不可为空
DEFAULT CURRENT_TIMESTAMP -- 默认当前时间戳
ON UPDATE CURRENT_TIMESTAMP -- 修改时自动以当前时间戳为准
);
INSERT INTO cc06 (birthday , job_time)
VALUES('2022-11-11','2022-11-11 10:10:10');
SELECT * FROM cc06
根据所得接结果可知login_time列,自动插入当前时间戳
此时我们再进行对birthday,job_time 列 插入新的数据
INSERT INTO cc06 (birthday , job_time)
VALUES('2022-11-12','2022-11-12 11:10:10');
SELECT * FROM cc06
列login_time 会根据当前的时间进行更新