MySQL数据类型(basic)
基本类型
整数类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
TINYINT | 1 | 有符号 -128 无符号 0 |
有符号 127 无符号 255 |
SMALLINT | 2 | 有符号 -32768 无符号 0 |
有符号 32767 无符号 65535 |
MEDIUMINT | 3 | 有符号 -8388608 无符号 0 |
有符号 8388607 无符号 1677215 |
INT INTEGER | 4 | 有符号 -2147483648 无符号 0 |
有符号 2147483647 无符号 4294967295 |
浮点数类型 | 字节 | 最小值 | 最大值 |
FLOAT | 4 | ||
DOUBLE | 8 | ||
定点数类型 | 字节 | 描述 | 描述 |
DEC(M,D), DECIMAL(M,D) |
M+2 | 最大取值范围与DOUBLE相同, | 给定DECIMAL的有效取值范围 由M和D决定 |
位类型 | 字节 | 最小值 | 最大值 |
BIT(M) | 1~8 | BIT(1) | BIT(64) |
日期类型
日期和时间类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
DATE | 4 | 1000-01-01 | 9999-12-32 |
DATETIME | 8 | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 4 | 19700101080001 | 2038年的某个时刻 |
TIME | 3 | -838:59:59 | 838:59:59 |
YEAR | 1 | 1901 | 2155 |
TIMESTAMP
- show variables like 'explicit%'; 来查看变量
- TIMESTAMP默认CURRENT_TIMESTAMP和not null和on update CURRENT_TIMESTAMP
- MySQL中只给表中的第一个TIMESTAMP字段设置默认值为系统日期, 如果有第二个TIMESTAMP类型, 则默认值设置为0
- MySQL5.6之前,可以修改第二个timestamp类型字段为其他日期常量,但是不能再修改为current_timestamp.同一张表中只有一列的默认值为current_timestamp. 在MySQL5.6版本之后, 这个限制已经去掉了
- 如果把1中的explict_defaults_for_timestamp设置为on, 则默认值 . not null 和 on update current_timestamp不会自动设置
- TIMESTAMP重要特点, 就是和时区相关.
- 当插入日期的时候, 会先转化为本地时区后存放
- 当从数据库取出后, 也同样需要将日期转换为本地时区后显示
TIMESTAMP与DATETIME区别
- timestamp支持的时间范围小, 而datetime范围大.两者都可以设置默认值和on update current_timestamp属性. 使得日期列可以随其他列更新而自动更新为最新时间.
- timestamp在MySQL5.6.6版本之后增加了控制参数 explicit_defaults_for_timestamp, 如果设置为on 则timestamp需要显示指定默认值和on update current_timestamp属性. 如果设置为off, 则会自动设置默认值.
- 当explicit_defaults_for_timestamp设置为off时, 表中额第一个TIMESTAMP列自动设置为系统时间. 如果在一个TIMESTAMP列中插入NULL, 则该列值会自动设置为当前的日期和时间. 在插入或更新一行但不明确给TIMESTAMP列赋值时也会自动设置该列的值为当前的日期和时间
- TIMESTAMP的插入和查询都受当地时区的影响, 更能反映出实际的日期, DATETIME则只能反映出插入时当地的时区, 其他时区的人查看数据必然有很大的误差.
- TIMESTAMP的属性受MySQL版本和服务器SQLMode的影响很大.
字符串类型
字符串类型 | 字节/字符 | 描述及存储需求 |
---|---|---|
CHAR(M) | M个字符 | M为0~255整数 |
VARCHAR(M) | 0~M个字符 | M为0~65535之间整数, 值的长度+1一个字节 |
BITARY(M) | M个字符 | M为0~255之间的整数 |
VARBINARY(M) | 0~M个字符 | M为0~65535之间整数,值的长度+1字节 |
TINYBLOB | 允许长度0~255字节,值长度+1字节 | |
BLOB | 0~65535 value+2 | |
MEDIUMBLOB | 0~167772150 value+3 | |
LONGBLOB | 0~4294967295 value+4 | |
TINYTEXT | 0~255 value+1 | |
TEXT | 0~65535 value+2 | |
MEDIUMTEXT | 0~167772150 value+3 | |
LONGTEXT | 0~4294967295 value+4 |
CHAR和VARCHAR类型
CHAR与VARCHAR很类似, 都是用来保存MySQL较短的字符串. 两者的区别主要是存储方式的不同
CHAR列的长度固定为创建表时声明的长度, 长度可以为从0~255的任何值
VARCHAR列中的值为可变长度, 长度可以指定0~65535之间的值
在检索的时候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;
ENUM类型
枚举类型, 值范围需要在创建表时通过枚举方式显式指定 对1~255个成员的枚举需要1个字节存储 对255~65535个成员需要2个字节存储.
最多允许拥有65535个成员
create table t (gender enum('M','F'));
insert into t values('M'),('1'),('f'),(NULL);
select * from t;
上述例子中可以看出ENUM类型是忽略大小写的, 1代表了枚举中的第一个元素M
SET类型
SET和ENUM类型非常类似, 也是由一个字符串对象, 里面可以包含0~64个成员, 成员不同存储上也不同
1~8 -> 一字节
9~16 -> 2
17~24 -> 3
25~32 -> 4
33~64 ->8
create table t(col set('a','b','c','d'))
insert into t values('a,b'),('a,d,a'),('a,c'),('a');
select * from t;
JSON类型
JSON是JavaScript Object Notation缩写(很有用), 它是一种数据交换格式.
JSON出现前数据交换大多使用XML类传递数据
但是XML规范太JB多了
在2002年雅虎工程师Douglas Crockford于2002年发明了JSON, 风靡WEB自5.7.8版本起, MySQL开始支持JSON类型. 此前通常使用VARCHAR或TEXT来保存JSON格式数据.
- JSON数据类型会自动校验数据是否为JSON格式. 如果不是JSON格式会报error
- MySQL提供了一组操作JSON数据的内置函数, 可以方便地提取各类数据, 可以修改特定的键值.
- 优化的存储格式, 存储在JSON列中的JSON数据被转换成内部的存储格式, 允许快速读取
create table t1(id1 json);
insert into t1 values('{"age":20,"time":"2018-07-14 10:52:00"}');
select JSON_TYPE('"abc"') js1,JSON_TYPE('[1,2,"abc"]') js2,JSON_TYPE('{"k1":"value"}') js3;
热水有益于身体健康
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南