各自努力,最高处见!加油!
MySQL数据类型
- 一、数据类型分类表
- 二、数值类型
- 1、整型
- 2、bit型
- 3、小数类型
- 二、二进制类型
- 什么时候用char,什么时候用varchar
- 三、时间类型
一、数据类型分类表
代码均要在mysql命令行下执行
二、数值类型
1、整型
以tinyint为例,其余同理
tinyint 类型数据有符号的范围-128 ~ 127,没有符号0 ~ 255。没有指定unsigned就是有符号的。
#创建t3表,里面有名为id的变量,tinyint类型的
CREATE TABLE t3(
id TINYINT);
CREATE TABLE t4(
id TINYINT UNSIGNED);
#添加语句,往表中添加数据
INSERT INTO t3 VALUES(127);
#显示表
SELECT * FROM t3
2、bit型
范围在1~64,显示以二进制形式显示。
如果一个数据只有0,1 两个值,可以考虑使用bit(1)可以节约空间。
#创建表,括号中的数字为指定位数。
CREATE TABLE t05(num BLT(8));
#添加数据
INSERT INTO t05 VALUES(1,3);
#显示表
SELECT * FROM t05;
#查找的时候仍然可以按照10进制数来查找
SELECT * FROM t05 WHERE num=1;
3、小数类型
- FLOAT 单精度
- DOUBLE 双精度
- DECIMAL(M,D),M表示长度,D表示小数后的位数。M最大是65,D最大是30.如果D为0,则没有小数点。如果D被省略,默认为0
。如果M被省略,默认为10 。
#创建表
CREATE TABLE t06(
num1 FLOAT,
num2 DOUBLE,
num3 DECIMAL(30,20));
#添加数据
INSERT INO t06 VALUES(88.12345678912345, 88.12345678912345,88.12345678912345);
SELECT * FROM t06;
#decimal可以存放很大的数
CREATE TABLE t07 (
num DECIMAL(65));
INSERT INTO t07 VALUES(8999999933338388388383838838383009338388383838383838383);
SELECT * FROM t07;
CREATE TABLE t08(
num BIGINT UNSIGNED)
INSERT INTO t08 VALUES(8999999933338388388383838838383009338388383838383838383);
SELECT * FROM t08;
二、二进制类型
在存放文本时,也可以使用TEXT数据类型(可以视为VARCHAR列),注意text不能有默认值,大小为0-2^16。
char固定长度字符串0~255字符。
注意:
char(4) 这个4表示字符数(最大255),不是字节数,不管是中文还是字母都放四个,按字符计算。
char(4)是定长(固定的大小),就是说,即使插入’aa’,也会占用分配的4个字符空间
varchar可变长度字符串 0~65535字节,注意这里是字节为单位。
Varchar(4) 这个4表示字符数,不管是字母还是中文都以定义好的表的编码来存放数据utf8.这四个字符占多少字节取决于编码方式。
Varchar(4) 是变长,如果插入了‘aa’,实际占用空间大小并不是4个字符,而是按照实际占用的空间来分配。(另外:varchar本身还需要占用1-3个字节来记录存放内容长度)
【1-3个字节用于记录大小】
- 如果表的编码是 utf8 varchar(size) size = (65535-3) / 3 = 21844
- 如果表的编码是 gbk varchar(size) size = (65535-3) / 2 = 32766
什么时候用char,什么时候用varchar
- 如果数据是定长,推荐使用char,如md5的密码,邮编,手机号,身份证号
- 如果字段不是定长使用varchar,如留言,文章。
- 查询速度:char>varchar.
#固定长度字符串 0~255 字符<<-字符
CHAR(size)
#可变长度字符串 0~65535字节<<-字节,注意这里是字节为单位
VARCHAR(size)
#创建表,存有name变量,大小为255.
CREATE TABLE t09 (
`name` CHAR(255));
#创建表,存有name变量,以gbk规则编码,大小为32766.
CREATE TABLE t10 (
`name` VARCHAR(32766)) CHARSET gbk;
DROP TABLE t10;
#韩老师课程笔记:
#char(4) 和 varchar(4) 这个4表示的是字符,而不是字节, 不区分字符是汉字还是字母
CREATE TABLE t11(
`name` CHAR(4));
INSERT INTO t11 VALUES('韩顺平好');
SELECT * FROM t11;
CREATE TABLE t12(
`name` VARCHAR(4));
INSERT INTO t12 VALUES('韩顺平好');
INSERT INTO t12 VALUES('ab北京');
SELECT * FROM t12;
#如果varchar 不够用,可以考试使用mediumtext 或者longtext,
#如果想简单点,可以使用直接使用text
CREATE TABLE t13( content TEXT, content2 MEDIUMTEXT , content3 LONGTEXT);
INSERT INTO t13 VALUES('韩顺平教育', '韩顺平教育100', '韩顺平教育1000~~');
SELECT * FROM t13;
三、时间类型
基本使用
CREATE TABLE birthday6(t1 DATE,
t2 DATETIME,
t3 TIMESTAMP NOT NULL DEFAULT
CURRENT_TIMESTAMP ON UPDATE
CURRENT_TIMESTAMP);timestamp时间戳
mysql> INSERT INTO birthday(t1,t2)
VALUES('2022-11-11','2022-11-11 10:10:10');
细节说明:
TimeStamp在Insert和update时,自动更新
#韩老师笔记:
#创建一张表, date , datetime , timestamp
CREATE TABLE t14 (
birthday DATE , -- 生日
job_time DATETIME, -- 记录年月日 时分秒
login_time TIMESTAMP
NOT NULL DEFAULT CURRENT_TIMESTAMP #以当前时间更新
ON UPDATE CURRENT_TIMESTAMP); -- 登录时间, 如果希望login_time列自动更新, 需要配置
SELECT * FROM t14;
INSERT INTO t14(birthday, job_time)
VALUES('2022-11-11','2022-11-11 10:10:10');
-- 如果我们更新 t14表的某条记录,login_time列会自动的以当前时间进行更新