3.1 数值类型
整数类型 |
字节 |
最小值 |
最大值 |
TINYINT |
1 |
有符号-128 无符号0 |
有符号127 无符号255 |
SMALLINT |
2 |
有符号-32768 无符号0 |
有符号32767 无符号65535 |
MEDIUMINT |
3 |
有符号-8388608 无符号0 |
有符号8388607 无符号1677215 |
INT INTEGER |
4 |
有符号-2 147 483 648 无符号0 |
有符号2 147 483 647 无符号4 294 967 295 |
BIGINT |
8 |
有符号...... 无符号0 |
有符号...... 无符号...... |
浮点数类型 |
字节 |
最小值 |
最大值 |
FLOAT |
4 |
+/-1.175 494 351 E-38 |
+/-3.402 823 466 351 E+38 |
DOUBLE |
8 |
+/-2.225 073 858 507 201 4 E-308 |
+/-1.797 693 134 862 315 7 E+308 |
定点数类型 |
字节 |
描述 |
DEC(M,D) DECIMAL(M,D) |
M+2 |
最大取值范围与DOUBLE相同,给定DECIMAL的有效取值范围由M和D决定 |
位类型 |
字节 |
最小值 |
最大值 |
BIT(M) |
1~8 |
BIT(1) |
BIT(64) |
3.2 日期时间类型
日期类型 |
字节 |
日期格式 |
日期范围 |
DATE |
4 |
YYYY-MM-DD |
1000-01-01 ~ 9999-12-31 |
DATETIME |
8 |
YYYY-MM-DD HH:MM:SS |
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
TIMESTAMP |
4 |
YYYY-MM-DD HH:MM:SS |
1970-01-01 00:00:01 ~ 2038年的某个时刻 |
TIME |
3 |
YYYY |
-838:59:59 ~ 838:59:59 |
YEAR |
1 |
YYYY |
1901 ~ 2155 |
MySql中日期和时间类型的零值表示
数据类型 |
零值表示 |
DATETIME |
0000-00-00 00:00:00 |
DATE |
0000-00-00 |
TIMESTAMP |
00000000000000 |
TIME |
00:00:00 |
YEAR |
0000 |
DATETIME与TIMESTAMP使用注意事项
(1)、存储与展示
TIMESTAMP |
DATETIME |
以UTC格式保存(stores the number of milliseconds) |
实际格式储存 |
检索值时需要基于时区转化 |
与时区无关 |
说明:show variables like 'time_zone%'; 默认显示的是SYSTEM,表明它的时区与操作系统的时区值一样。如果讲时区改成东九区(日本), 北京时间(GMT+0800),则timestamp时间会比实际数据库中时间早1小时。
(2)、创建表时
create table d_time (
id int auto_increment primary key,
dtime datetime,
stime timestamp
) ENGINE=InnoDB DEFAULT CHARSET=utf8 comment '测试datetime和timestamp'
datetime和timestamp类型的表字段若均未指定默认值类型:
datetime默认为null;
而timestamp为NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP。
insert操作 |
DATETIME |
TIMESTAMP |
备注 |
now() |
当前时间 |
同 |
|
null |
null |
CURRENT_TIMESTAMP |
timestamp默认not null,否则其值为null |
'0000-00-00' |
0000-00-00 00:00:00 |
同 |
|
''或'abc'等非法字符 |
0000-00-00 00:00:00 |
同 |
|
'2038-01-01' |
2038-01-01 00:00:00 |
同 |
|
'2039-01-01' |
2039-01-01 00:00:00 |
0000-00-00 00:00:00 |
同 |
(3)、对于timestamp 的其他的属性
null 是否为空
默认允许为 “非空”(not null by default), 如果你在定义“ts TIMESTAMP DEFAULT NULL” 是非法的Invalid default value。
可以指定为空 null ,“stime TIMESTAMP NULL"
default(一个表中只能有一个列选择下面其中一种)
a、default CURRENT_TIMESTAMP
b、default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
c、ON UPDATE CURRENT_TIMESTAMP
3.3 字符串类型
类型 |
大小 |
用途 |
CHAR |
0-255字节 |
定长字符串 |
VARCHAR |
0-255字节 |
变长字符串 |
TINYBLOB |
0-255字节 |
不超过255个字符的二进制字符串 |
TINYTEXT |
0-255字节 |
短文本字符串 |
BLOB |
0-65 535字节 |
二进制形式的长文本数据 |
TEXT |
0-65 535字节 |
长文本数据 |
MEDIUMBLOB |
0-16 777 215字节 |
二进制形式的中等长度文本数据 |
MEDIUMTEXT |
0-16 777 215字节 |
中等长度文本数据 |
LOGNGBLOB |
0-4 294 967 295字节 |
二进制形式的极大文本数据 |
LONGTEXT |
0-4 294 967 295字节 |
极大文本数据 |
ENUM类型
ENUM 是一个字符串对象,其值通常选自一个允许值列表中。
它的值范围需要在创建表时通过枚举方式显示的指定。
对于1~255个成员的枚举需要1个字节存储。
对于255~65535个成员,需要2个字节存储。
最多允许65535个成员。
create table t (gender enum('MALE', 'FMALE') DEFAULT NULL);
insert into t(gender) values ('MALE');
+--------+
| gender |
+--------+
| MALE |
+--------+
insert into t values ('MALE'), ('1'), ('FMALE'), (NULL);
+--------+
| gender |
+--------+
| MALE |
| MALE |
| MALE |
| FMALE |
| NULL |
+--------+
说明:
当插入的值不存在时,如插入了‘1’,这在enum('MALE', 'FMALE')时不存在的,默认会取enum的第一个值插入到数据库中,这里是‘MALE’。
定义为ENUM的列('one','two','three')可以有下面所示任何值。
值 |
索引 |
NULL |
NULL |
'' |
0 |
'one' |
1 |
'two' |
2 |
'three' |
3 |
SET类型
SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。
指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。
SET成员值本身不能包含逗号。
CREATE TABLE myset (col SET('a', 'b', 'c', 'd') DEFAULT NULL);
INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
mysql> select * from myset;
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
5 rows in set (0.00 sec)
INSERT INTO myset (col) VALUES ('a,d,d,s');
说明:
如果将SET列设置为一个不支持的值,则该值被忽略并发出警告,但仍然能将SET集合包含的数据添加到数据库中。
SET值按数字顺序排序。
NULL值排在非NULL SET值的前面。
通常情况,可以使用FIND_IN_SET()函数或LIKE操作符搜索SET值:
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0;
mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%';
第1个语句找出SET_col包含value set成员的行。
第2个类似,但有所不同:
它在其它地方找出set_col包含value的行,甚至是在另一个SET成员的子字符串中。
INSERT INTO myset (col) VALUES ('b,c');
SELECT * FROM myset WHERE FIND_IN_SET('c', col)>0;
+------+
| col |
+------+
| b,c |
+------+