MySql数据类型

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  |
+------+

你可能感兴趣的:(mysql)