MySQL数据类型

目录

一、数值类型

[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类型的特点)

三、时间日期类型

四、String类型------ENUM和SET

五、数据类型汇总


一、数值类型

数值类型有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;
 
 
 

五、数据类型汇总

相关推荐
码云骑士1 小时前
jwt入门介绍
linux·运维·数据库
努力努力再努力wz1 小时前
【Redis 入门系列】为什么需要 Redis?一文串起缓存、分布式、读写分离、分库分表与微服务
数据库·redis·分布式·sql·mysql·缓存·微服务
得闲喝茶1 小时前
SQL处理数据的常用语法语句
数据库·笔记·sql·数据分析·excel
金玉满堂@bj1 小时前
PostgreSQL:企业级全能开源数据库
数据库·postgresql·开源
ooseabiscuit2 小时前
Laravel6.x新特性全解析
java·开发语言·后端·mysql·spring
todoitbo2 小时前
CTE 与外层 JOIN 的条件下推:原理、边界与验证方法
数据库·join·cte
TEC_INO2 小时前
Linux56:读取人脸图片并把特征值保存到sqlite3数据库
数据库·oracle
刘~浪地球2 小时前
MongoDB分片集群实战:水平扩展海量数据
数据库·mongodb
鸽芷咕2 小时前
KingbaseES中的PL_SQL编程:存储过程、函数、触发器与包的开发指南
数据库·sql·oracle