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个字符数 - 其他的类型:
binary
和varbinary
类型:类似于char和varchar,不同的是他们包含的是二进制的字符串Enum
类型(枚举类型)
要求插入的值必须属于列表中指定的值之一
如果列表成员为1~255个,则需要一个字节存储
如果列表成员为256~65535个则,需要2个字节存储
最多需要65535个成员
例如下案例1
set
类型,集合类型
插入的元素只要是集合的子集就行
例如下案例2text
、blob
(较大的二进制数据,如图片)
案例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;
四、日期型数据
字节数 | 含义 | 范围 | 时区影响 | ||
| 8 | 表示日期和时间 | 1000年—9999年 | 不受影响 | 案例3 |
| 4 | 表示时间戳(日期和时间) | 1970年—2038年 | 受影响 | |
| 4 | 表示日期 | |||
| 3 | ||||
| 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;