04 MySQL数据类型
MySQL支持的数据类型
1.数值类型:
a.整数类型
TINYINT | 1字节 |
有符号(-128~127);
无符号(0~255)
|
SMALLINT | 2字节 |
有符号(-32768~32767);
无符号(0~65535)
|
MEDIUMINT | 3字节 | |
INT , INTEGER | 4字节 | |
BIGINT | 8字节 |
b.浮点类型
FLOAT | 4字节 | |
DOUBLE | 8字节 |
c.定点数类型
DEC(M,D) | (M+2)字节 | |
DECIMAL(M,D) | (M+2)字节 |
d.位类型
BIT(M) | 1~8字节 | BIT(1)~BIT(64) |
⚠️注意:
1).AUTO_INCREMENT 属性只能定义在整数类型的column上,并且该字段要定义为NOT NULL 以及必须是PRIMARY KEY 或者是UNIQUE ;
2).如果某一列定义ZEROFILL, 那么MySQL会自动添加UNSIGNED属性,即该列是无符号的。
3).定位数中, M代表:一共显示M位数字;D是指小数位有D个数字;
浮点数使用 (M,D)这种用法是非标准的,如果进行数据库的迁移,最好不要这么使用.
FLOAT和DOUBLE的默认精度是由硬件和操作系统决定的;DECIMAL默认整数位为10,小数位为0;
如果插入数据范围超过了限制范围(小数部分)
如果是浮点型,会进行四舍五入
如果是定位型,在SQLMode模式下无法插入记录;在非SQLMode模式,会弹出warning,数据按照四舍五入
;整数部分应该会报错 todo;
4).BIT(M),M取值范围1~64,默认为1.用于保存二进制数据.例如BIT(1) 可以保存0和1,但是无法保存2,因为2在二进制中是10,占两位,报错;
使用SELECT不能直接正常显示BIT类型数据,序号借助BIT() 或HEX()函数进行显示.
2.日期类型
DATE | 4字节 |
DATETIME | 8字节 |
TIMESTAMP | 4字节 |
TIME | 3字节 |
YEAR | 1字节 |
注意:
表中第一个TIMESTAMP类型的数据默认值为CURRENT_TIMESTAMP,后面如果还有该类型,默认值为0;
也就是说一个表中最多只能有一个默认值为CURRENT_TIMESTAMP的TIMESTAMP类型的字段.
TIMESTAMP 会受时区影响,而DATETIME不会.
SHOW VARIABLES LIKE 'time_zone' ;
SET time_zone = '+9:00';
TIMESTAMP最多能存到2038年的某一天,所以不适合存太久远的时间.如果溢出,系统会使用0000-00-00 00:00:00 进行填补.
3.字符串类型
CHAR(M) | M字节 | M取值范围:0~255 |
VARCHAR(M) | M取值范围:0~65535 | |
TINIBLOB | ||
BLOB | ||
MEDIUMBLOB | ||
LONGBLOB | ||
TINYTEXT | ||
TEXT | ||
MEDIUMTEXT | ||
LONGTEXT | ||
VARBINARY(M) | ||
BINARY(M) | M字节 |
NOTE :
CHAR类型会去掉数据后面的空格;VARCHAR类型则会保留.
BINARY和VARBINARY 与CHAR/VARCHAR 区别是前者包含二进制字符串,而后者不包含
CREATE TABLE t (c BINARY(3)) ;
INSERT INTO t SET c='a'; --注意插入语句与数值型的不同
SELECT * , HEX(c) , c='a' , c='a\0' , c='a\0\0' FROM t ;
4.枚举类型ENUM
对于第1~255个成员的枚举,需要1个字节存储;
对于255~65335个成员需要2个字节来存储.
枚举类型对数据是忽略大小写的.
如果插入不在范围,则默认插入第一个值.
ENUM类型只允许从值集合中选取单个值,不可以一次取多个值.
CREATE TBALE t (gender ENUM('M','F'));
INSERT INTO t VALUES('M'),('1'),('f'),(NULL);
5.SET类型
存储方式:
1~8个成员 | 占1个字节 |
9~16个成员 | 占2个字节 |
17~24个成员 | 占3个字节 |
25~32个成员 | 占4个字节 |
33~64个成员 | 占8个字节 |
SET类型与ENUM类型除了存储方式,最大的区别就是 SET可以一次性选取多个成员.
CREATE TBALE t (col SET('a','b','c','d'));
INSERT INTO t VALUES('a,d,a'),('a,b'),('c');
--其中'a,d,a'会被去重,真正存储的是'a,d'