使用规范:在能够满足需求的情况下, 尽量选择占用空间小的
# 演示整形的使用
# 使用tinyint来演示范围 有符号 -128 ~ 127 如果没有符号 0-255
# 1. 如果没有指定 unsigned,则TINYINT就是有符合
# 2. 如果指定 unsigned,则TINYINT就是无符合 0-255
CREATE TABLE t1 (
id TINYINT);
CREATE TABLE t2 (
id TINYINT UNSIGNED);
INSERT INTO t1 VALUES (-128); # 这是非常简单的添加语句
INSERT INTO t2 VALUES (255);
SELECT * FROM t2
create table t10 (id tinyint); 默认是有符号的
create table t10 (id tinyint unsigned); 无符号的
1、基本使用
mysql > create table t2(num bit(8));
mysql > insert into t2(1, 3);
mysql > insert into t2 values(2, 65);
2、细节说明
bit 字段显示时,按照位的方式显示
查询的时候仍然可以用使用添加的数值
如果一个值只有 0,1 可以考虑使用 bit(1),可以节约空间
位类型。M指定位数,默认值1,范围1-64
实际开发中使用不多
# 演示 bit 类型使用
# 1. bit(m) m 在 1-64
# 2. 添加数据 范围 按照你给的位数来确定,比如 m=8 表示一个字节,0-255
# 3. 显示按照bit
# 4. 查询时,仍然可以按照数来查询
CREATE TABLE t3 (num BIT(8));
INSERT INTO t3 VALUES (255);
SELECT * FROM t3
SELECT * FROM t3 WHERE num = 1
1、FLOAT/DOUBLE(UNSIGNED)
Float 单精度,Double 双精度
2、DECIMAL[M, D](UNSIGNED)
可以支持更加精确的小位数。M是小数位数(精度)的总数,D是小数点(标度)后面的位数
如果D是0,则值没有小数点或分数部分。M最大65。D最大是30。如果D被省略,默认是0。如果M被省略,默认是10
建议:如果希望小数的精度高,推荐使用decimal
# 演示decimal类型、float、double 使用
#创建表
CREATE TABLE t4 (
num1 FLOAT,
num2 DOUBLE,
num3 DECIMAL(30, 20) );
# 添加数据
INSERT INTO t4 VALUES(88.12345678912345, 88.12345678912345, 88.12345678912345)
SELECT * FROM t4
#DECIMAL 可以存放很大的数
CREATE TABLE t5(
num1 DECIMAL(65));
INSERT INTO t5 VALUES(999999999999999999999999999999999999999999999999999);
SELECT * FROM t5
#BIGINT则无法存放特别大的数
CREATE TABLE t6(
num1 BIGINT UNSIGNED);
INSERT INTO t6 VALUES(999999999999999999999999999999999999999999999999999);# 添加失败
SELECT * FROM t6
CHAR(size):固定长度字符串,最大255字符
VARCHAR(size):可变长度字符串,最大65532字节
(utf8编码最大21844字符,1-3个字节用于记录大小)
# 演示字符串类型使用 char varchar
-- CHAR(size):固定长度字符串,最大255字符
-- VARCHAR(size):可变长度字符串,最大65532字节 (utf8编码最大21844字符,1-3个字节用于记录大小)
-- 如果表的编码是 utf8 varchar(size) size = (65535-3) / 3 = 21844
-- 如果表的编码是 gbk varchar(size) size = (65535-3) / 2 = 32766
CREATE TABLE t6(
`name` CHAR(255));
CREATE TABLE t7(
`name` VARCHAR(21844));
CREATE TABLE t8(
`name` VARCHAR(32766))CHARSET gbk;
1、细节1:
char(4):这个4表示字符数(最大255),不是字节数,不管是中文还是字母都是放四个,按字符计算
varchar(4):这个4表示字符数,不管是字母还是中文都以定义好的表的编码来存放数据
不管是中文还是英文字母,都是最多存放4个,是按照字符来存放的
2、细节2:
char(4) 是定长(固定的大小),就是说,即使你插入'aa',也会占用分配的4个字符空间
varchar(4) 是变长,就是说,如果你插入了'aa',实际占用空间大小并不是4个字符,而是按照实际占用空间来分配
(说明:varchar本身还需要占用1-3个字节来记录存放内容长度) L(实际数据大小) + (1-3)字节
3、细节3:
什么时候使用 char,什么时候使用varchar
(1)如果数据是定长,推荐使用char,比如md5的密码,邮编,手机号,身份证号等
(2)如果一个字段的长度是不确定的,我们使用varchar,比如留言,文章
查询速度:char > varchar
4、细节4:
在存放文本时,也可以使用Text数据类型,可以将TEXT列视为VARCHAR列,注意Text不能有默认值,大小0-2^16字节,如果希望存放更多的字符,可以选择 MEDIUMTEXT 0-2^24 或者 LONGTEXT(0~2^32)
# 演示字符串类型的使用细节
# char(4) 和 varchar(4) 这个4表示的是字符,而不是字节,不区分字符是汉字还是字母
CREATE TABLE t9(
`name` CHAR(4));
INSERT INTO t9 VALUES('abcd');
SELECT * FROM t9;
CREATE TABLE t10(
`name` VARCHAR(4));
INSERT INTO t10 VALUES ('你好你好');
INSERT INTO t10 VALUES ('你好aa');
SELECT * FROM t10
# 如果varchar不够用,可以考虑使用 mediumtext 或 longtext,
# 如果想简单点,可以直接使用 text
CREATE TABLE t11(
content1 TEXT, contnet2 MEDIUMTEXT, nontent3 LONGTEXT );
INSERT INTO t11 VALUES('啊啊啊啊啊', '你好你好你好aa100', '红红火火~~')
SELECT * FROM t11
CREATE TABLE birthday (
t1 DATE,
t2 DATETIME,
t3 TIMESTAMP
NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
);
细节说明:TimeStamp在Insert和update时,会自动更新
# 演示时间相关的类型
# 创建一张表,date,datetime,timestamp
CREATE TABLE t12 (
birthday DATE, -- 生日
job_time DATETIME, -- 记录年月日 时分秒
login_time TIMESTAMP -- 登录时间,如果希望login_time列自动更新,需要配置
NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ;
INSERT INTO t12(birthday, job_time) VALUES ('2022-11-11', '2022-11-11 22:22:22')
SELECT * FROM t12
# 如果我们更新了 t12 表的某条记录,login_time列会自动以当前时间更新
# 创建表的练习
-- 字段属性
-- Id 整形
-- name 字符型
-- sex 字符型
-- brithday 日期型(date)
-- entry_date 日期型 (date)
-- job 字符型
-- Salary 小数型
-- resume 文本型
CREATE TABLE emp (
id INT,
`name` VARCHAR(32),
sex CHAR(1),
birthday DATE,
entry_date DATETIME,
job VARCHAR(32),
salary DOUBLE,
`resume` TEXT
) CHARSET utf8 COLLATE utf8_bin ENGINE INNODB;
INSERT INTO emp VALUES(1, '张三', '男', '2022-12-16', '2023-3-30 22:22:22', '***', 2222, '***');
SELECT * FROM emp
# 修改表的练习
-- 员工表 emp 的上增加一个 image 列,varchar 类型(要求在 resume 后面)
ALTER TABLE emp
ADD image VARCHAR(32) NOT NULL DEFAULT ' '
AFTER RESUME;
-- 修改 job 列,使其长度为 60
ALTER TABLE emp
MODIFY job VARCHAR(60) NOT NULL DEFAULT ' ';
-- 删除 sex 列
ALTER TABLE emp
DROP sex;
-- 表名改为 employee
RENAME TABLE emp TO employee;
-- 修改表的字符集为 utf8
ALTER TABLE employee
CHARACTER SET utf8;
-- 列名 name 修改为 user_name
ALTER TABLE employee
CHANGE `name` user_name VARCHAR(32);
DESC employee -- 显示表的结构,可以查看表的所有列