当前位置: 首页 > news >正文

MySQL——数据类型

目录

一、数值类型

1. 整型

2. 小数类型

FLOAT与DOUBLE

DECIMAL

3. BIT类型

二、字符串类型

1. CHAR与VARCHAR

2. BLOB与TEXT

三、日期与时间类型

四、ENUM与SET类型

1. ENUM(单选)

2. SET(多选)

五、选择数据类型的建议

六、常见问题


一、数值类型

1. 整型

MySQL支持多种整型,根据存储范围和需求选择:

类型字节带符号范围无符号范围
TINYINT1-128 ~ 1270 ~ 255
SMALLINT2-32768 ~ 327670 ~ 65535
INT4-2147483648 ~ 21474836470 ~ 4294967295
BIGINT8-2^63 ~ 2^63-10 ~ 18446744073709551615

注意事项

  • 默认情况下,整型为有符号。若需无符号,使用UNSIGNED关键字。

  • 不建议过度依赖无符号类型,超出范围时直接升级到更大类型(如BIGINT)更稳妥。

示例

-- 越界插入会报错
CREATE TABLE t1(num TINYINT);
INSERT INTO t1 VALUES(128); -- ERROR 1264: Out of range value

 

tinyint类型是8个字节,超过这个范围mysql会自动检查,并不会插入到表中; 

说明:

在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。

可以通过UNSIGNED来说明某个字段是无符号的

无符号案例


2. 小数类型

FLOAT与DOUBLE
  • FLOAT:4字节,精度约7位,适用一般科学计算。

  • DOUBLE:8字节,精度约15位,适合高精度需求。

FLOAT(M,D) -- M为总位数,D为小数位

 

小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。


DECIMAL

定点数类型,精确存储小数,适合财务计算:

decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。
 

DECIMAL(M,D) -- M总位数,D小数位(默认M=10, D=0)

 

关于参数的最大比特位数; 

对比

CREATE TABLE t2 (salary FLOAT(10,8), salary2 DECIMAL(10,8));
INSERT INTO t2 VALUES(23.12345612, 23.12345612);
-- 查询结果:FLOAT显示23.12345695(精度丢失),DECIMAL保持原值


 


3. BIT类型

存储位字段,常用于布尔值或状态标志:

BIT(M) -- M范围1~64,默认1

特性

  • 插入非0/1值会越界报错。

  • 显示时按ASCII码转换(如65显示为'A')。

示例

CREATE TABLE t3 (status BIT(1));
INSERT INTO t3 VALUES(0), (1); -- 成功
INSERT INTO t3 VALUES(2); -- ERROR 1406: Data too long

 

我们发现给个1和0成功插入了,但是显示不出来;因为这里使用的 按ASCII码转换(如65显示为'A');

转为10进制显示就ok了; 


 

二、字符串类型

1. CHAR与VARCHAR

类型特点适用场景
CHAR定长,速度快,可能浪费空间固定长度数据(如MD5)
VARCHAR变长,节省空间,效率略低可变长度数据(如地址)

编码影响

  • UTF-8下,VARCHAR最大长度为21844字符(每个字符占3字节)。

  • GBK下,最大为32766字符(每个字符占2字节)。

我们知道每个汉字占3个字节,那么在c语言中,6个字节就只能存2个汉字,但在mysql当中一个汉字就是一个char。

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
 

 

 

 说明:

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:

varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。

当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。

示例

CREATE TABLE t4 (phone CHAR(11), address VARCHAR(100));

2. BLOB与TEXT

  • BLOB:存储二进制数据(如图片)。

  • TEXT:存储大文本,不支持默认值和全文索引(需MySQL 5.6+)。


三、日期与时间类型

类型格式字节范围
DATEYYYY-MM-DD31000-01-01 ~ 9999-12-31
DATETIMEYYYY-MM-DD HH:MM:SS8同DATE
TIMESTAMP时间戳(同DATETIME)41970-01-01 ~ 2038-01-19

特性

  • TIMESTAMP自动更新为当前时间,适合记录数据修改时间。

示例

CREATE TABLE logs (
    event_time DATETIME, 
    update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

 


四、ENUM与SET类型

1. ENUM(单选)

从预定义选项中选择一个值,内部存储为数字(1,2,3...):

ENUM('男', '女') -- 插入时可用'男'或1

2. SET(多选)

支持多个选项,内部按位存储(1,2,4,8...):

SET('登山', '游泳', '篮球')

查询技巧
使用FIND_IN_SET函数匹配多选值:

SELECT * FROM votes WHERE FIND_IN_SET('登山', hobby) > 0;

五、选择数据类型的建议

  1. 精确性优先:财务计算用DECIMAL,避免FLOAT精度丢失。

  2. 空间优化:小范围数据用TINYINT而非INT。

  3. 性能权衡:频繁查询字段用CHAR,变长数据用VARCHAR。

  4. 时间记录:需要自动更新时间戳时选TIMESTAMP。


六、常见问题

  1. 数值越界:插入前校验范围,或使用SIGNED/UNSIGNED约束。

  2. 字符长度超限:根据编码计算VARCHAR最大长度。

  3. 日期格式错误:严格遵循YYYY-MM-DD等标准格式。


合理选择数据类型是高效数据库设计的基石。通过理解各类型的特性及适用场景,开发者可以优化存储结构,提升系统性能。

相关文章:

  • Postman 新手入门指南:从零开始掌握 API 测试
  • 嵌入式Linux | 什么是 BootLoader、Linux 内核(kernel)、和文件系统?
  • 基于javaweb的SpringBoot智能相册管理系统图片相册系统设计与实现(源码+文档+部署讲解)
  • 音视频处理的“瑞士军刀”与“积木”:FFmpeg 与 GStreamer 的深度揭秘
  • 【系统架构设计师】操作系统 - 文件管理 ③ ( 树形目录结构 | 文件属性 | 绝对路径 与 相对路径 )
  • C++类:特殊的数据成员
  • Linux环境使用jmeter做性能测试
  • 全球化2.0 | ZStack云计算系统工程师(ZCCE)国际认证培训成功举办
  • win10 c++ VsCode 配置PCL open3d并显示
  • 猎豹移动(Cheetah Mobile)
  • 【Unity】TextMesh Pro显示中文部分字体异常
  • 基于FPGA的3U机箱模拟量高速采样板ADI板卡,应用于轨道交通/电力储能等
  • 游戏引擎学习第157天
  • LeRobot源码剖析——对机器人各个动作策略的统一封装:包含ALOHA ACT、Diffusion Policy、VLA模型π0
  • 关于微信小程序端base64解码问题
  • 【Spring】声明式事务传播机制
  • 【Go】go语言指针
  • 表达式引擎之通用的开屏页后端接口设计
  • 需要使用新应用以打开此ms-gamingoverlay链接怎么解决
  • 【FPGA】——实现六位流水灯
  • 俄外长:俄将在不损害伙伴关系前提下发展对美关系
  • 招行一季度净利372.86亿降2.08%,营收降逾3%
  • 新疆维吾尔自治区原质量技术监督局局长刘新胜接受审查调查
  • 北京动物园:大熊猫“萌兰”没有参加日本大阪世博会的计划
  • 初步结果显示,卡尼领导的加拿大自由党在联邦众议院选举中获胜
  • 杭州6宗涉宅用地收金125.76亿元,萧山区地块楼面价冲破5万元/平米