数据类型
1. 数值类型(11)
1. 整数类型(6)
占用 1 个字节的存储空间。
有符号的取值范围是从 -128 到 127,无符号的取值范围是从 0 到 255。
适用于存储一些小型的整数值,如性别(0 表示女,1 表示男)、状态标志等。
占用 2 个字节的存储空间。
有符号的取值范围是从 -32768 到 32767,无符号的取值范围是从 0 到 65535。
常用于存储一些相对较小的整数数据,如年龄、月份等。
占用 3 个字节的存储空间。
有符号的取值范围是从 -8388608 到 8388607,无符号的取值范围是从 0 到 16777215。
可用于存储一些中等范围的整数,如小型计数器的值等。
占用 4 个字节的存储空间。
有符号的取值范围是从 -2147483648 到 2147483647,无符号的取值范围是从 0 到 4294967295。
是最常用的整数类型之一,适用于一般的整数数据存储,如用户 ID、订单号等。
占用 8 个字节的存储空间。
有符号的取值范围是从 -9223372036854775808 到 9223372036854775807,无符号的取值范围是从 0 到 18446744073709551615。
用于存储非常大的整数,如大型项目的编号、海量数据的自增主键等。
2. 定点数类型(2)
存储精确的小数数据。
使用时需要指定精度和标度,例如 DECIMAL(10,2) 表示总共 10 位数字,其中小数部分占 2 位。
适用于需要精确存储和计算的金融数据、货币金额等场景,如银行账户余额、商品价格等。
3. 浮点数类型(2)
占用 4 个字节的存储空间。
单精度浮点数,可表示的范围约为 -3.402823466E+38 到 -1.175494351E-38、0 以及 1.175494351E-38 到 3.402823466E+38。
适用于对精度要求不是特别高的浮点数存储和计算,如科学计算中的近似值、一些测量数据等。
占用 8 个字节的存储空间。
双精度浮点数,可表示的范围约为 -1.7976931348623157E+308 到 -2.2250738585072014E-308、0 以及 2.2250738585072014E-308 到 1.7976931348623157E+308。
相比于 FLOAT,DOUBLE 具有更高的精度,可用于需要更精确浮点数计算的场景,但仍然存在一定的精度误差。
4. 位类型(1)
用于存储位字段值。
可以指定存储的位数,例如 BIT(8) 表示存储 8 位的二进制数据。
适用于存储一些以位为单位的数据,如标志位、权限位等。
2. 字符类型(12)
1. 定长字符类型(1)
特点:CHAR 类型是定长的字符类型,在存储时会自动在右侧填充空格以达到指定的长度。例如,定义为 CHAR (10) 的字段,无论实际存储的字符长度是多少,都会占用 10 个字节的存储空间。
长度范围:CHAR 类型的最大长度为 255 字节。
适用场景:适用于存储长度固定的数据,如身份证号码、手机号码等,因为这些数据的长度是固定的,使用 CHAR 类型可以提高存储和检索的效率。
2. 变长字符类型(1)
特点:VARCHAR 类型是变长的字符类型,它只占用实际存储字符所需的空间,再加上一个字节或两个字节来记录字符串的长度。例如,存储 "MySQL" 这个字符串,使用 VARCHAR 类型时实际占用的空间就是字符串的长度 5 字节,再加上一个字节或两个字节来记录长度,而不是像 CHAR 类型那样固定占用指定长度的空间。
长度范围:VARCHAR 类型的最大长度为 65535 字节,但实际使用时可能会受到字符集和存储引擎的限制。例如,在 UTF-8 字符集中,一个字符可能占用 1-3 个字节,因此实际能够存储的字符数量会相应减少。
适用场景:适用于存储长度不确定且经常变化的文本数据,如文章标题、用户评论等,这样可以节省存储空间,提高存储效率。
3. 文本类型(4)
特点:TINYTEXT 类型用于存储较短的文本数据,它是一种变长类型,实际存储的长度取决于文本的内容。
长度范围:TINYTEXT 类型可以存储最多 255 个字符。
适用场景:适用于存储一些简短的说明、摘要等文本信息。
特点:TEXT 类型用于存储中等长度的文本数据,也是变长类型,能够根据实际存储的文本长度动态分配存储空间。
长度范围:TEXT 类型可以存储最多 65535 个字符。
适用场景:常用于存储文章内容、产品描述等相对较长的文本信息。
特点:MEDIUMTEXT 类型用于存储较长的文本数据,其存储容量比 TEXT 类型更大。
长度范围:MEDIUMTEXT 类型可以存储最多 16777215 个字符。
适用场景:适用于存储大型的文本内容,如长篇小说、详细的技术文档等。
特点:LONGTEXT 类型是 MySQL 中用于存储极长文本数据的类型,能够满足对大量文本数据存储的需求。
长度范围:LONGTEXT 类型可以存储最多 4294967295 个字符,其存储容量非常大。
适用场景:常用于存储超大型的文本数据,如完整的书籍内容、大型的网页数据等。
4. 二进制类型(6)
特点:BINARY 类型类似于 CHAR 类型,但是它存储的是二进制数据而不是字符数据。在存储时,BINARY 类型会在右侧填充 \0 以达到指定的长度。
长度范围:BINARY 类型的最大长度为 255 字节。
适用场景:适用于存储一些二进制格式的数据,如图像、音频、视频等文件的二进制数据,或者是一些需要以二进制形式存储和比较的加密数据等。
特点:VARBINARY 类型类似于 VARCHAR 类型,它是变长的二进制类型,只占用实际存储二进制数据所需的空间,再加上一个字节或两个字节来记录数据的长度。
长度范围:VARBINARY 类型的最大长度为 65535 字节。
适用场景:适用于存储长度不确定的二进制数据,如不同大小的图像文件、加密后的密码等。
特点:TINYBLOB 类型用于存储较短的二进制数据,它是一种变长类型,实际存储的长度取决于二进制数据的内容。
长度范围:TINYBLOB 类型可以存储最多 255 个字节的二进制数据。
适用场景:适用于存储一些小型的二进制文件或数据块,如小型图标、短音频片段等。
特点:BLOB 类型用于存储中等长度的二进制数据,也是变长类型,能够根据实际存储的二进制数据长度动态分配存储空间。
长度范围:BLOB 类型可以存储最多 65535 个字节的二进制数据。
适用场景:常用于存储较大的二进制文件,如普通图像文件、小型视频片段等。
特点:MEDIUMBLOB 类型用于存储较长的二进制数据,其存储容量比 BLOB 类型更大。
长度范围:MEDIUMBLOB 类型可以存储最多 16777215 个字节的二进制数据。
适用场景:适用于存储大型的二进制文件,如高清图像文件、较长的视频片段等。
特点:LONGBLOB 类型是 MySQL 中用于存储极长二进制数据的类型,能够满足对大量二进制数据存储的需求。
长度范围:LONGBLOB 类型可以存储最多 4294967295 个字节的二进制数据,其存储容量非常大。
适用场景:常用于存储超大型的二进制数据,如大型视频文件、高分辨率图像等。
11. ENGTH()
SELECT LENGTH('text');
SELECT LENGTH('王');
3. 日期类型(5)
格式:以 'YYYY-MM-DD' 的格式存储日期值,例如 '2024-11-13'。
范围:从 '1000-01-01' 到 '9999-12-31'。
存储字节数:3 个字节。
适用场景:用于存储日期,如出生日期、入职日期、订单日期等,当只需要关注日期部分,不需要时间信息时使用。
格式:以 'HH:MM:SS' 的格式存储时间值,例如 '12:30:00'。也可以表示时间间隔,使用格式为 'HHH:MM:SS',其中 'HHH' 表示小时数,范围可以超过 24 小时。
范围:从 '-838:59:59' 到 '838:59:59'。
存储字节数:3 个字节。
适用场景:用于存储时间,如会议时间、营业时间等,或者用于表示时间间隔,如某个操作所花费的时间。
格式:以 'YYYY-MM-DD HH:MM:SS' 的格式存储日期和时间值,例如 '2024-11-13 12:30:00'。
范围:从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。
存储字节数:8 个字节。
适用场景:当需要同时记录日期和时间信息时使用,如事件发生的时间、数据记录的时间戳等。
格式:以 'YYYY-MM-DD HH:MM:SS' 的格式存储日期和时间值,与 DATETIME 格式相同,例如 '2024-11-13 12:30:00'。
范围:从 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC。
存储字节数:4 个字节。
特殊属性:TIMESTAMP 类型的值会根据服务器的时区设置自动进行转换,并且在插入或更新数据时,如果没有指定 TIMESTAMP 列的值,MySQL 会自动将当前的日期和时间插入到该列中。
适用场景:常用于记录数据的最后修改时间、创建时间等,因为它能够自动更新并且占用的存储空间相对较小。
格式:可以使用 4 位数字(YYYY)或 2 位数字(YY)来表示年份。4 位数字的范围是从 1901 到 2155,2 位数字的范围是从 70 到 69,表示的年份范围是 1970 到 2069。
存储字节数:1 个字节。
适用场景:适用于只需要存储年份信息的场景,如毕业年份、生产年份等。
4. 其他类型(12)
ENUM类型允许在创建表时指定一列可以取的值的集合。
例如,定义一个名为gender的列,其类型为ENUM('male', 'female', 'unknown'),则该列只能存储这三个预定义的值中的一个。
MySQL 以一种高效的二进制格式来存储 JSON 数据,这种格式在存储和检索时能够提供较好的性能。
当插入 JSON 数据时,MySQL 会自动解析并将其转换为内部的二进制表示形式进行存储,在查询时再将其转换回 JSON 格式返回给用户。
JSON 数据在存储时没有固定的长度限制,但实际上会受到 MySQL 的最大行大小限制以及存储引擎的限制。
一般来说,对于 InnoDB 存储引擎,一个行的最大大小约为 65,535 字节,但这并不是绝对的限制,具体取决于存储引擎的配置和其他因素。
POINT类型的数据由一对坐标值(X,Y)确定其在二维平面上的位置。
例如,POINT(3.0 4.0)表示坐标为(3.0,4.0)的点。
在 MySQL 中,坐标值可以是整数、小数或其他有效的数值类型。
LINESTRING用于存储一系列连续的点,这些点按顺序连接形成一条线。
在 MySQL 中,点的坐标通常使用二维平面坐标表示,格式为(x y),其中x表示横坐标,y表示纵坐标。
例如,LINESTRING(0 0, 1 1, 2 2)表示从点(0, 0)开始,经过点(1, 1),到点(2, 2)的一条折线。
POLYGON由一系列的点按顺序连接形成一个封闭的环来定义。
这些点的坐标表示了多边形的顶点位置,且最后一个点必须与第一个点相同,以确保多边形的封闭性。
例如,POLYGON((0 0, 0 3, 3 3, 3 0, 0 0))表示一个以点(0, 0)、(0, 3)、(3, 3)、(3, 0)、(0, 0)为顶点的矩形。
GEOMETRY是 MySQL 中用于表示几何数据的一种通用数据类型,它是所有几何数据类型的基类。
其他具体的几何数据类型如 POINT点、LINESTRING线、POLYGON多边形 等都可以看作是GEOMETRY类型的子类或特定实现。
GEOMETRYCOLLECTION是一种特殊的几何数据类型,它可以包含多种不同类型的几何对象。
这些几何对象可以是 POINT点、LINESTRING线、POLYGON多边形、MULTIPOINT多点、MULTILINESTRING多行字符串、MULTIPOLYGON多个多边形 等中的任意一种或多种组合。
例如,GEOMETRYCOLLECTION(POINT(1 1), LINESTRING(2 2, 3 3), POLYGON((4 4, 4 6, 6 6, 6 4, 4 4)))就包含了一个点、一条线和一个多边形。
REAL类型是一种用于存储单精度浮点数的数据类型。
REAL类型在 MySQL 中通常使用 4 个字节来存储数据。
它遵循 IEEE 754 标准的单精度浮点数格式,能够表示一定范围内的实数,大约可以提供 7 位有效数字的精度。
其取值范围约为 -3.402823466E+38 到 -1.175494351E-38、0 以及 1.175494351E-38 到 3.402823466E+38。
在创建表时,可以使用SET类型来定义列,其语法为:column_name SET('value1', 'value2', 'value3',...)。
例如,CREATE TABLE my_table (hobbies SET('reading', 'writing', 'painting', 'sports')); 创建了一个名为my_table的表,其中包含一个名为hobbies的SET类型列,它可以存储 'reading'、'writing'、'painting'、'sports' 这几个值中的一个或多个组合。
MySQL 会将SET值存储为一个或多个比特位的组合,每个预定义的值对应一个比特位。
例如,对于上述的hobbies列,如果值为 'reading' 和'sports',则在存储时会将对应 'reading' 和'sports' 的比特位置为 1,其他比特位为 0。这种存储方式非常紧凑,能够有效地节省存储空间。
1. GEOMETRY 对比 GEOMETRYCOLLECTION
对比维度 | GEOMETRY | GEOMETRYCOLLECTION |
---|
数据类型通用性 | 是所有几何数据类型的基类,通用性强 | 特定的复杂几何数据类型,用于组合多种几何对象 |
存储结构复杂度 | 相对较简单,不同几何形状有各自特定存储方式 | 相对复杂,需存储多种几何对象及其类型信息 |
数据表示灵活性 | 单一几何对象表示,灵活性有限 | 可包含多种几何对象,灵活性高 |
适用场景 | 适用于表示单一类型的几何对象,如简单的点、线、多边形等 | 适用于表示复杂的几何对象组合或需要整合多种几何数据的场景 |
空间操作复杂度 | 相对简单,针对单一几何对象操作 | 相对复杂,需遍历集合中的多个几何对象进行操作 |