MySQL中常见的数据类型

一、整形

1.1如何设置有符号和无符号
DROP TABLE IF EXISTS tab_int;
CREATE TABLE tab_int(
	t1 INT,				--定义有符号的整形,默认显示宽度为11
	t2 INT UNSIGNED,	--定义无符号整形,默认显示宽度为10
	t3 INT(7) ZEROFILL 	--定义整形的显示宽度为7
);
DESC tab_int;
1.2整数总结

分类: tinyint(1字节)smallint(2字节)mediumint(3字节)int(4字节)bigint(8字节)

特点:

①如果不设置无符号还是有符号,默认是有符号;如果想设置无符号,用关键字unsigned
②如果插入的数值超过整形的范围,会报out of range异常,并且必须插入临界值
③如果不设置长度,会有默认长度 长度:代表了显示的最大宽度,如果不够,会用0在左边填充,但是需要搭配zerofill使用

二、小数

2.1分类:
  • 1.浮点型 float(M,D) double(M,D)
  • 2.定点型 dec(M,D) decimal(M,D)
2.2特点:

①M:整数部位数+小数部位数

D:小数部位数

如果超过范围,则插入临界值

②三种数据类型,M和D都可以省略

如果是decimal,则M默认为10,D默认为0

如果是float和double,则会根据插入的精度来决定精度,在满足最大范围之内的情况下,插入啥就是啥

③定点型的精确度较高,如果要求插入的数值要求精度较高如金融计算,优先使用定点型

2.3数据类型的选择原则:

1、所选择的类型越简单越好
2、能保存数值的类型越小越好

三、字符型数据(文本和二进制等)

写法

M的意思

特点

空间

效率

CHAR

CHAR(M)

最大字符数,可省略,默认1

固定长度的字符

相对耗费


VARCHAR

VARCHAR(M)

最大字符数,不可省略

可变长度的字符

相对节省


  • 注意:M表示最长的字符数,如'你好abc'就是5个字符数
  • 其他的类型:
  • binaryvarbinary类型:类似于char和varchar,不同的是他们包含的是二进制的字符串
  • Enum类型(枚举类型)
要求插入的值必须属于列表中指定的值之一
如果列表成员为1~255个,则需要一个字节存储
如果列表成员为256~65535个则,需要2个字节存储
最多需要65535个成员

例如下案例1

  • set类型,集合类型
    插入的元素只要是集合的子集就行
    例如下案例2
  • textblob(较大的二进制数据,如图片)

案例1

CREATE TABLE tab_enum(
	t1 ENUM('a','b','c')
);

DESC tab_enum;

INSERT INTO tab_enum VALUE('a');
INSERT INTO tab_enum VALUE('b');
INSERT INTO tab_enum VALUE('c');
INSERT INTO tab_enum VALUE('d'); #插入出错
INSERT INTO tab_enum VALUE('A'); #插入a

SELECT * FROM tab_enum;

案例2

CREATE TABLE tab_set(
	e1 SET('a','b','c','d')
);

DESC tab_set;

INSERT INTO tab_set VALUE('a');
INSERT INTO tab_set VALUE('a,b');
INSERT INTO tab_set VALUE('a,b,c');	
INSERT INTO tab_set VALUE('a,b,c,D');	#插入正常,且不区分大小写
INSERT INTO tab_set VALUE('a,b,c,d,e'); #插入出错

SELECT * FROM tab_set;

四、日期型数据

字节数

含义

范围

时区影响

datetime

8

表示日期和时间

1000年—9999年

不受影响

案例3

timestamp

4

表示时间戳(日期和时间)

1970年—2038年

受影响

date

4

表示日期

time

3

year

1

案例3

DROP TABLE IF EXISTS tab_date;

CREATE TABLE tab_date(
	d1 DATETIME,
	d2 TIMESTAMP
);

INSERT INTO tab_date VALUES(NOW(),NOW());

SELECT * FROM tab_date;
修改时区时区之后,时间戳会显示当前时区的时间
SET time_zone = '+9:00'; --修改时区

SELECT * FROM tab_date;