如果你有一些编程基础,比如C语言、C++、Java等强类型语言,对这个概念肯定不陌生。如果没有学过,可以从数学中的整数、实数等概念进行迁移到整数型(整形int)、浮点型(float单精度,double双精度)。
一、整形
在mysql中,整形一共有五种,对应名称、大小如下表
整型 | 字节数 | signed有符号 | unsigned无符号 |
---|---|---|---|
tinyint | 1 | -128~127 | 0~255 |
smallint | 2 | -32768~32767 | 0~65535 |
mediumint | 3 | -8388608~8388607 | 0~16777215 |
int/integer | 4 | -2147483648~2147483647 | 0~4294967295 |
bigint | 8 | -9223372036954775808~9223372036854775807 | 0~18446744073709551615 |
特征:
①、默认是有符号整形(可插入负数),除非添加unsigned关键词进行限定
②、如果插入的数据超过了当前类型范围,则会默认插入临界值,并且抛出out of rang异常
1、设置无符号和有符号
DROP TABLE IF EXISTS tab_int;
CREATE TABLE tab_int(
#默认有符号整形
num1 INT(7),
#无符号整形
num2 INT(7) UNSIGNED
);
DESC tab_int;
2、out of range异常
#向tab_int表插入三条记录
INSERT INTO tab_int VALUES(-1234, 1234);
#num2是unsigned整形,所以-1234超过了下界零,故只能填充下界0
INSERT INTO tab_int VALUES(1234,-1234);
#num1、num2都是int型4个字节,超过表示范围num1填充下界,num2填充上界
INSERT INTO tab_int VALUES(-214748364894967296, 214748364894967296);
二、小数
分类:
1.浮点型
float(M,D)、double(M,D)
2.定点型
dec(M,D)、decimal(M,D)
其中M代表整数部位+小数部位的最大长度,D代表小数部位的长度
特征:
①、如果超过范围,则插入临界值
②、M和D都可以省略
如果是decimal,则M默认为10,D默认为0(也就是默认只存储整数部分)
如果是float和double,则会根据插入的数值的精度来决定精度
M、D部位长度的控制
DROP TABLE tab_float;
CREATE TABLE tab_float(
f1 FLOAT,
#设置整数+小数部位最大长度为5,小数部位最大长度为2
f2 FLOAT(5, 2),
d1 DOUBLE,
#设置整数+小数部位最大长度为5,小数部位最大长度为3
d2 DOUBLE(5, 3),
de1 DECIMAL,
#设置整数+小数部位最大长度为10,小数部位最大长度为3
de2 DECIMAL(10,3)
);
DESC tab_float;
#插入测试数据
INSERT INTO tab_float VALUES(123.4523, 123.4523, 123.4523, 123.4523, 123.4523, 123.4523);
INSERT INTO tab_float VALUES(123.456,123.456,123.456, 123.456,123.456,123.456);
INSERT INTO tab_float VALUES(123.4,123.4,123.4,123.4,123.4,123.4);
INSERT INTO tab_float VALUES(1523.4,1523.4,1523.4,1523.4,1523.4,1523.4);
SELECT * FROM tab_float;
可以看出设置了D,小数位数就是固定,默认会填充零。超过了边界就会使用边界值代替。
三、字符型
较短的文本:
char
varchar
其他:
binary和varbinary用于保存较短的二进制
enum用于保存枚举
set用于保存集合
较长的文本:
text
blob(较大的二进制,比如图片)
特点:
写法 M的意思 特点 空间的耗费 效率
char char(M) 最大的字符数,可以省略,默认为1 固定长度的字符 比较耗费 高
varchar varchar(M) 最大的字符数,不可以省略 可变长度的字符 比较节省 低
1、枚举型
CREATE TABLE tab_enum(
c1 ENUM('a','b','c')
);
INSERT INTO tab_enum VALUES('a');
INSERT INTO tab_enum VALUES('b');
INSERT INTO tab_enum VALUES('c');
#不再枚举范围中,所以将为空
INSERT INTO tab_enum VALUES('m');
#mysql不区分大小写,所以将插入'a'
INSERT INTO tab_enum VALUES('A');
SELECT * FROM tab_enum;
2、set
DROP TABLE IF EXISTS tab_set;
CREATE TABLE tab_set(
s1 SET('a','c','d','b')
);
INSERT INTO tab_set VALUES('a');
#mysql不区分大小写
INSERT INTO tab_set VALUES('A,B');
#set将自动排序
INSERT INTO tab_set VALUES('a,d,c');
#set将自动去重,并且不再设置范围内的元素无法插入
INSERT INTO tab_set VALUES('a,d,c,e,a');
SELECT * FROM tab_set;
四、日期型
分类:
date保存日期
time 只保存时间
year只保存年
datetime保存日期+时间
timestamp保存日期+时间
特点:
字节 范围 时区等的影响
datetime 8 1000——9999 不受
timestamp 4 1970-2038 受
DROP TABLE IF EXISTS tab_date;
CREATE TABLE tab_date(
t1 DATETIME,
t2 TIMESTAMP
);
#now()获取当前时间
INSERT INTO tab_date VALUES(NOW(),NOW());
SELECT * FROM tab_date;
以上就是mysql中的主要数据类型,相信大部分读者都有一定的编程语言基础,数据类型还是比较好理解。