1 数值类型
下图摘自: https://www.runoob.com/mysql/mysql-data-types.html
2 字符类型
类型 | 说明 | N的含义 | 是否有字符集 | 最大长度 |
---|---|---|---|---|
CHAR(N) | 定长字符 | 字符 | 是 | 255 |
VARCHAR(N) | 变长字符 | 字符 | 是 | 16384 |
BINARY(N) | 定长二进制字节 | 字节 | 否 | 255 |
VARBINARY(N) | 变长二进制字节 | 字节 | 否 | 16384 |
TINYBLOB(N) | 二进制大对象 | 字节 | 否 | 256 |
BLOB(N) | 二进制大对象 | 字节 | 否 | 16K |
MEDIUMBLOB(N) | 二进制大对象 | 字节 | 否 | 16M |
LONGBLOB(N) | 二进制大对象 | 字节 | 否 | 4G |
TINYTEXT(N) | 大对象 | 字节 | 是 | 256 |
TEXT(N) | 大对象 | 字节 | 是 | 16K |
MEDIUMTEXT(N) | 大对象 | 字节 | 是 | 16M |
LONGTEXT(N) | 大对象 | 字节 | 是 | 4G |
强调两点内容:
- 至少从mysql5.7开始CHAR(N)和VARCHAR(N)中N都是指的字符长度。
因此假如有人问你char数据类型长度为1时能否存储一个汉字 —> 你要斩钉截铁的说至少在mysql5.7及以后能
- mysql的字符集不是基于表的,更不是基于数据库的,而是基于列的 —> 同时应该知道,建立数据库时可以指定字符集和排序规则,建表时也可以指定,建立表中的字段时也可以指定
(如下面的图所示)
—> 也就是说假如你数据库层面指定了,建表和建字段时如果不特殊指定就会默认使用建库时指定的;建表时如果指定了,字段如果不特殊指定,就默认使用建表时指定的。
(1) 建立数据库时可以指定字符集和排序规则
(2) 建表时也可以指定字符集和排序规则
(3)在列上也可以指定字符集和排序规则
简单说下排序规则
- _ci结尾表示大小写不敏感(caseinsensitive)
- _cs表示大小写敏感(case sensitive)
- _bin表示二进制的比较(binary)
比如utf8时,就有这么多排序规则 —> 我所在的项目组基本都使用utf8_general_ci
3 日期类型
日期类型 | 占用空间 | 表示范围 |
---|---|---|
DATETIME | 8 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
DATE | 3 | 1000-01-01 ~ 9999-12-31 |
TIMESTAMP | 4 | 1970-01-01 00:00:00UTC ~ 2038-01-19 03:14:07UTC |
YEAR | 1 | YEAR(2):1970-2070, YEAR(4):1901-2155 |
TIME | 3 | -838:59:59 ~ 838:59:59 |
或如下(摘自: https://www.runoob.com/mysql/mysql-data-types.html):
- 注意: timestamp 是区分时区的,但datetime不会,可以用下面的语句证明:
-- datatime与timestamp区别
create table test_time(a timestamp, b datetime);
insert into test_time values (now(), now());
select * from test_time; -- 此时查询数据一样
select @@time_zone; --设置时区
set time_zone='+00:00';
select * from test_time; --此时不一样了