数据类型不仅决定了数据的存储方式,还影响了数据的存储效率、查询性能以及数据的精度和范围
本文将详细介绍MySQL建表时常见的数据类型,帮助读者更好地理解并选择适合的数据类型
一、数值类型 数值类型在MySQL中分为整数类型、浮点数类型和定点数类型
1.整数类型 整数类型包括TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT等
这些类型默认都是有符号整数,但可以指定为无符号(UNSIGNED)以扩大正数的取值范围
-TINYINT:占用1个字节,有符号范围为-128到127,无符号范围为0到255
适用于存储小范围的整数值
-SMALLINT:占用2个字节,有符号范围为-32,768到32,767,无符号范围为0到65,535
适用于存储中等范围的整数值
-MEDIUMINT:占用3个字节,有符号范围为-8,388,608到8,388,607,无符号范围为0到16,777,215
适用于存储较大范围的整数值
-INT(或INTEGER):占用4个字节,有符号范围为-2,147,483,648到2,147,483,647,无符号范围为0到4,294,967,295
是MySQL中最常用的整数类型,适用于存储大多数整数值
-BIGINT:占用8个字节,有符号范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807,无符号范围为0到18,446,744,073,709,551,615
适用于存储极大范围的整数值
此外,整数类型还可以指定显示宽度(M),但这并不影响存储大小,只是影响显示格式
例如,INT(6)在显示时如果数据宽度小于6位,则会在数字前面用字符填满宽度(需要配合ZEROFILL使用)
2.浮点数类型 浮点数类型包括FLOAT、DOUBLE和REAL
这些类型用于存储近似数值,可能会存在精度问题
-FLOAT:占用4个字节,表示单精度浮点数
语法为FLOAT【(m, d)】【UNSIGNED】,其中m指定显示长度,d指定小数位数
例如,FLOAT(4,2)表示的范围是-99.99到99.99(有符号)或0到99.99(无符号)
-DOUBLE:占用8个字节,表示双精度浮点数
精度比FLOAT更高,但存储空间也更大
默认类型就是DOUBLE
-REAL:在MySQL中,REAL类型实际上是FLOAT类型的同义词,除非在SQL模式中启用了REAL_AS_FLOAT选项
由于浮点数的表示方式,它们在某些情况下可能会存在精度问题
因此,在需要高精度计算的场景中(如金融、会计等),应谨慎使用浮点数类型
3. 定点数类型 定点数类型只有DECIMAL一种
与浮点数不同,定点数在MySQL内部是以字符串的形式进行存储的,因此它能够提供精确的计算结果
-DECIMAL:语法为DECIMAL(M, D)【UNSIGNED】,其中M指定长度,D表示小数点的位数
例如,DECIMAL(5,2)表示的范围是-999.99到999.99(有符号)或0到999.99(无符号)
DECIMAL类型的存储空间不是固定的,由精度值M决定
当数据的精度超出了定点数类型的精度范围时,MySQL会进行四舍五入处理
由于DECIMAL类型能够提供精确的计算结果,因此在需要高精度计算的场景中(如金融、会计等),应优先考虑使用DECIMAL类型
二、字符串类型 字符串类型在MySQL中分为固定长度字符串类型、可变长度字符串类型和文本类型
1. 固定长度字符串类型(CHAR) CHAR类型用于存储固定长度的字符串
在定义CHAR类型时,需要指定字符串的长度(L),单位为字符
CHAR类型会占用固定长度的存储空间,即使实际数据长度小于指定长度
-优点:查询速度快,因为字符串的长度是固定的,MySQL可以直接通过偏移量来访问字符串
-缺点:可能会浪费存储空间,特别是当实际数据长度远小于指定长度时
CHAR类型适用于存储长度固定的数据,如身份证号、电话号码等
2. 可变长度字符串类型(VARCHAR) VARCHAR类型用于存储可变长度的字符串
在定义VARCHAR类型时,也需要指定字符串的最大长度(L),但VARCHAR类型会根据实际数据长度来分配存储空间(还需要额外的一个或两个字节来存储长度信息)
-优点:存储空间利用率高,因为只占用实际数据长度所需的存储空间
-缺点:查询速度可能稍慢于CHAR类型,因为MySQL需要通过长度信息来访问字符串
VARCHAR类型适用于存储长度可变的数据,如姓名、地址、描述等
3.文本类型(TEXT) TEXT类型用于存储长文本数据
与CHAR和VARCHAR类型不同,TEXT类型的数据不会完全存储在内存中,而是存储在磁盘上
因此,在处理大量文本数据时,TEXT类型可能会比CHAR和VARCHAR类型更高效
-TINYTEXT:最多可存储255个字符
-TEXT:最多可存储65,535个字符(约64KB)
-MEDIUMTEXT:最多可存储16,777,215个字符(约16MB)
-LONGTEXT:最多可存储4,294,967,295个字符(约4GB)
TEXT类型适用于存储文章、评论、日志等需要存储大量文本数据的场景
但需要注意的是,由于TEXT类型的数据存储在磁盘上,因此查询和处理速度可能会受到一定影响
三、日期和时间类型 MySQL提供了多种日期和时间类型来满足不同的存储需求
-DATE:用于存储日期值(年-月-日),格式为YYYY-MM-DD
-TIME:用于存储时间值(时:分:秒),格式为HH:MM:SS
-DATETIME:用于存储日期和时间值(年-月-日 时:分:秒),格式为YYYY-MM-DD HH:MM:SS
-TIMESTAMP:与DATETIME类似,但TIMESTAMP类型的数据在存储时会转换为UTC时间,并在检索时根据会话时区进行转换
此外,TIMESTAMP类型还具有自动初始化和更新的特性(即可以在插入或更新记录时自动设置当前时间)
-YEAR:用于存储年份值,格式为YYYY
YEAR类型可以存储1901到2155年之间的年份值(两位数的年份会被转换为四位数的年份)
日期和时间类型适用于存储用户的生日、事件发生的时间、订单的创建和更新时间等场景
四、枚举和集合类型 MySQL还提供了枚举(ENUM)和集合(SET)类型来满足特定的存储需求
1.枚举类型(ENUM) ENUM类型允许用户定义一个字符串对象,该对象只能取指定集合中的一个值
在定义ENUM类型时,需要列出所有可能的取值
-优点:节省存储空间,因为ENUM类型在存储时实际上是用整数来代替字符串的
此外,ENUM类型还可以提高查询性能,因为MySQL可以对ENUM类型的列进行索引
-缺点:灵活性较差,一旦定义了ENUM类型的取值集合,就不能再添加新的取值(除非修改表结构)
ENUM类型适用于存储具有固定取值集合的数据,如性别、状态、类型等
2.集合类型(SET) SET类型与ENUM类型类似,但SET类型允许用户定义一个字符串对象,该对象可以取指定集合中的一个或多个值
在定义SET类型时,也需要列出所有可能的取值
-优点:与ENUM类型类似,SET类型也可以节省存储空间和提高查询性能
此外,SET类型还可以满足存储多个取值的需求
-缺点:与ENUM类型类似,SET类型的灵活性也