
目录
[1.1 TINYINT类型](#1.1 TINYINT类型)
[1.2 BIT类型](#1.2 BIT类型)
[1.3 FLOAT与DECIMAL](#1.3 FLOAT与DECIMAL)
[1.3.1 FLOAT类型](#1.3.1 FLOAT类型)
[1.3.2 DECIMAL类型](#1.3.2 DECIMAL类型)
[2.1 CHAR类型](#2.1 CHAR类型)
[2.2 VARCHAR类型](#2.2 VARCHAR类型)
[2.3 VHAR与VARCHAR的对比](#2.3 VHAR与VARCHAR的对比)
[2.3.1 CHAR类型的特点](#2.3.1 CHAR类型的特点)
[2.3.2 varchar类型的特点](#2.3.2 varchar类型的特点)
一、数值类型
数值类型有TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、BIT、FLOAT、DECIMAL等,我们介绍其中的TINYINT、FLOAT、DECIMAL其它类型都以此类推。

1.1 TINYINT类型
在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的,可以通过UNSIGNED来说明某个字段是无符号的。
TINYINT在有符号时,取值范围是-128~127,无符号时,取值范围是0~255。
sql
SHOW DATABASES;
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;
-- TINYINT
CREATE TABLE IF NOT EXISTS t1(
num TINYINT
);
DESC t1;
SHOW CREATE TABLE t1;
SHOW TABLES;
INSERT INTO t1 VALUES(-128);
INSERT INTO t1 VALUES(-127);
INSERT INTO t1 VALUES(0);
INSERT INTO t1 VALUES(-1);
INSERT INTO t1 VALUES(1);
SELECT * FROM t1;
INSERT INTO t1 VALUES(-129);
INSERT INTO t1 VALUES(128);
INSERT INTO t1 VALUES(130);
-- TINYINT(UNSIGNED)
CREATE TABLE IF NOT EXISTS t2(
num TINYINT UNSIGNED
);
SHOW TABLES;
DESC t2;
INSERT INTO t2 VALUES(0);
INSERT INTO t2 VALUES(255);
INSERT INTO t2 VALUES(100);
INSERT INTO t2 VALUES(-1);
INSERT INTO t2 VALUES(256);
1.2 BIT类型
基本语法:BIT(M):位字段类型。M表示每个值的位数(比特位),范围是从1~64。如果M被忽略,则默认为1。
sql
-- BIT(M)
CREATE TABLE IF NOT EXISTS t3(
id INT,
online BIT(1)
);
DESC t3;
INSERT INTO t3 (id,online) VALUES(123,0);
INSERT INTO t3 (id,online) VALUES(124,1);
SELECT * FROM t3;
INSERT INTO t3 (id,online) VALUES(123,5);
INSERT INTO t3 (id,online) VALUES(123,'a');
SELECT * FROM t3;
INSERT INTO t3 (id,online) VALUES(123,91);
SELECT * FROM t3;
CREATE TABLE IF NOT EXISTS t4(
id INT,
online BIT(65)
);
DESC t4;
CREATE TABLE IF NOT EXISTS t4(id INT,online BIT);
DESC t4;
1.3 FLOAT与DECIMAL
1.3.1 FLOAT类型
基本语法:FLOAT(m,d):m表示数字位的总个数,d表示小数的位数,占用空间4个字节。例如,float(4,2)表示的范围是-99.99~99.99(无符号:0~99.99),MySQL在保存值时会四舍五入。
sql
-- FLOAT(M,D)
CREATE TABLE IF NOT EXISTS t5(
id INT,
salary FLOAT(4,2)
);
SHOW TABLES;
INSERT INTO t5 (id,salary) VALUES(1,99.99);
INSERT INTO t5 (id,salary) VALUES(1,-99.99);
INSERT INTO t5 (id,salary) VALUES(1,-12.34);
SELECT * FROM t5;
INSERT INTO t5 (id,salary) VALUES(1,-99.999);
INSERT INTO t5 (id,salary) VALUES(1,-999.99);
INSERT INTO t5 (id,salary) VALUES(1,-100.00);
INSERT INTO t5 (id,salary) VALUES(1,100.0);
INSERT INTO t5 (id,salary) VALUES(1,-10.0);
SELECT * FROM t5;
INSERT INTO t5 (id,salary) VALUES(1,99.994);
INSERT INTO t5 (id,salary) VALUES(1,99.993);
INSERT INTO t5 (id,salary) VALUES(1,99.991);
SELECT * FROM t5;
INSERT INTO t5 (id,salary) VALUES(1,99.995);
INSERT INTO t5 (id,salary) VALUES(1,99.996);
INSERT INTO t5 (id,salary) VALUES(1,-99.997);
INSERT INTO t5 (id,salary) VALUES(1,-99.998);
CREATE TABLE IF NOT EXISTS t6(
id BIGINT,
salary FLOAT(4,2) UNSIGNED
);
DESC t6;
INSERT INTO t6 (id,salary) VALUES(1,99.996);
INSERT INTO t6 (id,salary) VALUES(1,99.999);
INSERT INTO t6 (id,salary) VALUES(1,999.9);
INSERT INTO t6 (id,salary) VALUES(1,99.99);
INSERT INTO t6 (id,salary) VALUES(1,99.99);
SELECT * FROM t5;
INSERT INTO t5 (id,salary) VALUES(1,32424234.21312);
SELECT * FROM t5;
INSERT INTO t5 (id,salary) VALUES(1,3242.21312);
INSERT INTO t5 (id,salary) VALUES(1,32423423422.21);
SELECT * FROM t5;
1.3.2 DECIMAL类型
基本语法:DECIMAL(m,d):m表示数字位的总个数,d表示小数点的位数。例如:DECIMAL(5,2)表示的范围是-999.99~999.99(无符号:0~999.99)。DECIMAL和FLOAT很像,但是有区别,两者表示的精度不一样,DECIMAL的m最大位数是65(若m被省略,则默认是10),d的最大位数是30(若d被省略,则默认是0)。
sql
-- DECIMAL(M,D)
CREATE TABLE IF NOT EXISTS t7(
f1 FLOAT(10,8),
f2 DECIMAL(4,2)
);
DESC t7;
INSERT INTO t7 (f1,f2) VALUES(10.0,99.99);
INSERT INTO t7 (f1,f2) VALUES(10.0,-99.99);
INSERT INTO t7 (f1,f2) VALUES(10.0,-99.999);
INSERT INTO t7 (f1,f2) VALUES(10.0,99.999);
INSERT INTO t7 (f1,f2) VALUES(10.0,0.1);
INSERT INTO t7 (f1,f2) VALUES(10.0,99.994);
INSERT INTO t7 (f1,f2) VALUES(10.0,23.935);
SELECT * FROM t7;
二、文本、二进制类型
2.1 CHAR类型
基本语法:CHAR(L):固定长度字符串,L表示存储字符的个数,最大为255。
sql
-- CHAR(L)
SHOW TABLES;
CREATE TABLE IF NOT EXISTS t8(
id INT,
name CHAR(2)
);
DESC t8;
INSERT INTO t8 (id,name) VALUES(1,'a');
INSERT INTO t8 (id,name) VALUES(1,'b');
INSERT INTO t8 (id,name) VALUES(1,'ab');
INSERT INTO t8 (id,name) VALUES(1,'abc');
SELECT * FROM t8;
INSERT INTO t8 (id,name) VALUES(1,'中');
INSERT INTO t8 (id,name) VALUES(1,'中国');
INSERT INTO t8 (id,name) VALUES(1,'中国人');
SELECT * FROM t8;
2.2 VARCHAR类型
基本语法:VARCHAR(L):可变长度字符串,L表示字符长度,最大长度为65535个字节(21845个字符)。
sql
-- CHAR(L)
SHOW TABLES;
CREATE TABLE IF NOT EXISTS t8(
id INT,
name CHAR(2)
);
DESC t8;
INSERT INTO t8 (id,name) VALUES(1,'a');
INSERT INTO t8 (id,name) VALUES(1,'b');
INSERT INTO t8 (id,name) VALUES(1,'ab');
INSERT INTO t8 (id,name) VALUES(1,'abc');
SELECT * FROM t8;
INSERT INTO t8 (id,name) VALUES(1,'中');
INSERT INTO t8 (id,name) VALUES(1,'中国');
INSERT INTO t8 (id,name) VALUES(1,'中国人');
SELECT * FROM t8;
2.3 VHAR与VARCHAR的对比
在utf8编码格式下,一个字符(1个字母、数字或汉字)占3个字节,在gbk编码格式下,一个字符占2个字节。
2.3.1 CHAR类型的特点
1.char在开辟空间时一次性开好;
2.不需要长度来标识;
3.不需要维护计数器表明当前多少个字符;
4.char适用于字符串长度较为固定的;
所以,char的效率更高。
2.3.2 varchar类型的特点
1.开辟空间时用多少给多少,最大为上限;
2.varchar长度可以指定0到65535之间的值,但是有1~3个字节用于记录数据的大小,所以说有效字节数是65532;
3.varchar需要维护长度和有效字节的个数;
4.varchar适用于字符串长度起伏大的;
所以,varchar的效率低。
三、时间日期类型
date:日期类型'yyyy-mm-dd',占用3个字节;
datetime:日期时间类型'yyyy-mm-dd HH:ii:ss',表示范围是从1000到9999,占用八字节;
timestamp:时间戳,从1970年1月1日午夜到现在累积的描述,格式与datetime完全一致,占用四字节。当我们对一条记录(一行)中的任意字段做更改或插入时,timestamp会自动更新。
sql
-- 日期和时间管理
CREATE TABLE IF NOT EXISTS t11(
t1 DATE,
t2 DATETIME,
t3 TIMESTAMP -- DEFAULT CURRENT_TIMESTAMP(设置自动更新规则)
);
DESC t11;
INSERT INTO t11 (t1,t2,t3) VALUES('2000-10-01','1949-10-01 08:00:00',NOW());
SELECT * FROM t11;
CREATE TABLE IF NOT EXISTS t12(
content TEXT,
time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
INSERT INTO t12 (content) VALUES('这个世界还是好人多');
SELECT * FROM t12;
UPDATE t12 SET content='这个世界还是好人多,我说的';
SELECT * FROM t12;
DESC t11;
UPDATE t11 SET t1 = '1999-01-01' ,t3=NOW();
SELECT * FROM t11;
四、String类型------ENUM和SET
enum:枚举,"单选"类型。
enum('选项1','选项2','选项3',......);
set:集合,"多选"类型。
set('选项1','选项2','选项3',......);
enum和set对应选项的下标从1开始。
FIND_IN_SET函数用于集合查询,判断某一个元素是否在集合中,若存在,返回元素在集合中的下标,不存在返回0。
NULL表示什么都没有,' '表示空字符串。
sql
-- ENUM和SET
CREATE TABLE IF NOT EXISTS votes(
username VARCHAR(30),
gender ENUM('男','女'),
hobby SET('代码','羽毛球','乒乓球','足球','游泳')
);
DESC votes;
INSERT INTO votes VALUES('张飞','男','代码');
SELECT * FROM votes;
INSERT INTO votes VALUES('刘备','女','代码');
INSERT INTO votes VALUES('孙权','unknown','代码');
INSERT INTO votes VALUES('孙权','比特','代码');
INSERT INTO votes VALUES('孙权','好','代码');
INSERT INTO votes VALUES('孙权','a','代码');
INSERT INTO votes VALUES('孙权','b','代码');
INSERT INTO votes VALUES('孙权',0,'代码');
SELECT * FROM votes;
INSERT INTO votes VALUES('孙权',1,'代码');
INSERT INTO votes VALUES('孙权',2,'代码');
INSERT INTO votes VALUES('孙权',-1,'代码');
INSERT INTO votes VALUES('孙权',-3,'代码');
INSERT INTO votes VALUES('孙权',0,'代码');
INSERT INTO votes VALUES('孙权',0,'代码');
INSERT INTO votes VALUES('孙权',0,'代码');
INSERT INTO votes VALUES('孙权',1,'代码');
INSERT INTO votes VALUES('孙权',1,'代码');
INSERT INTO votes VALUES('孙权',1,'代码');
INSERT INTO votes VALUES('孙权',1,'代码');
INSERT INTO votes VALUES('孙权',1,'代码');
SELECT * FROM votes;
INSERT INTO votes VALUES('曹操',1,'羽毛球');
INSERT INTO votes VALUES('曹操',1,'代码,羽毛球');
INSERT INTO votes VALUES('曹操',1,'羽毛球,乒乓球');
INSERT INTO votes VALUES('曹操',1,'代码,羽毛球,乒乓球');
INSERT INTO votes VALUES('曹操',1,'篮球');
INSERT INTO votes VALUES('曹操',1,'飞盘');
INSERT INTO votes VALUES('曹操',1,'乒乓球,足球,游泳');
SHOW CREATE TABLE votes;
INSERT INTO votes (username) VALUES('曹操');
SELECT * FROM votes;
DESC votes;
INSERT INTO votes VALUES('刘表',1,0);
INSERT INTO votes VALUES('刘表',1,1);
SELECT * FROM votes;
INSERT INTO votes VALUES('刘表',1,2);
SELECT * FROM votes;
INSERT INTO votes VALUES('刘表',1,4);
INSERT INTO votes VALUES('刘表',1,7);
SELECT * FROM votes;
INSERT INTO votes VALUES('刘表',1,31);
SELECT * FROM votes;
-- 有关ENUM和SET的查询操作
SELECT * FROM votes WHERE gender='男';
SELECT * FROM votes WHERE gender='女';
SELECT * FROM votes WHERE gender=1;
SELECT * FROM votes WHERE gender=0;
SELECT * FROM votes WHERE gender=2;
SELECT * FROM votes WHERE gender=3;
SELECT * FROM votes WHERE hobby='羽毛球';
SELECT * FROM votes WHERE gender=1;
SELECT * FROM votes WHERE gender=3;
SELECT * FROM votes WHERE hobby='代码,羽毛球';
DESC votes;
SELECT 1+1;
SELECT FIND_IN_SET('a','a,b,c');
SELECT FIND_IN_SET('b','a,b,c');
SELECT FIND_IN_SET('c','a,b,c');
SELECT FIND_IN_SET('a,b','a,b,c');
SELECT FIND_IN_SET('a,c','a,b,c');
SELECT FIND_IN_SET('a,d','a,b,c');
SELECT FIND_IN_SET('c','a,b,c');
SELECT FIND_IN_SET('b','a,b,c');
SELECT * FROM votes;
SELECT * FROM votes WHERE hobby='羽毛球';
SELECT * FROM votes WHERE FIND_IN_SET('羽毛球',hobby);
SELECT * FROM votes WHERE FIND_IN_SET('羽毛球,代码',hobby);
SELECT * FROM votes WHERE FIND_IN_SET('羽毛球',hobby) AND FIND_IN_SET('代码',hobby);
SELECT * FROM votes WHERE hobby=31;
五、数据类型汇总
