数据类型简介
了解 MySQL 内置的五大类数据类型。
MySQL 支持五种数据类型类别:数值型、日期和时间型、字符串型、空间型以及 JSON 型。在本课程中,我们通过汽车型号的例子简要概述这五类数据类型。通常,我们可以为一个汽车型号分配多个属性。在此示例中,我们仅关注型号名称、功率(单位:千瓦)以及发布年份这三个属性。在 SQL 中,我们可以将这三个属性分别用 TEXT、INT 和 YEAR 数据类型来表示。为了简化处理,我们不考虑功率的分数部分。因此,将汽车型号建模为 SQL 表的形式如下:
1-- 创建用于示例汽车型号的临时表。 2DROP TABLE IF EXISTS CarModel; 3CREATE TEMPORARY TABLE CarModel 4( 5 id INT AUTO_INCREMENT, 6 name TEXT DEFAULT NULL, 7 `power (kW)` INT DEFAULT NULL, 8 `release year` YEAR DEFAULT NULL, 9 PRIMARY KEY (id) 10);
数值型数据类型
尽管我们在汽车型号示例中使用了 INT 这一数值型数据类型,但 MySQL 提供的数值型数据类型实际上可分为四类:位值型、整数型、定点型和浮点型。
BIT(M) 用于存储 M 位的值,其中 M 的取值范围为 1 到 64。位值的表示方式为 b'value'、B'value' 或 0bvalue。例如,b'10' 在十进制中表示数字 2。对于整数类型,MySQL 提供了五种数据类型:TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT。它们在存储字节数和可表示的最大值上有所不同。与整数类似,定点类型 DECIMAL(也称为 NUMERIC、DEC 和 FIXED)用于存储精确的数值,特别适用于需要保持精度的场景,如货币金额。相反,浮点类型 FLOAT 和 DOUBLE(也称作 REAL 和 DOUBLE PRECISION)用于存储近似数值,分别占用 4 字节(单精度)和 8 字节(双精度)。
日期和时间型数据类型
在我们的汽车型号示例中,使用了 YEAR 类型来表示车型的发布年份。虽然这种用法很方便,但 MySQL 还提供了多种其他数据类型,可用于更完整的日期和时间建模。
作为 YEAR 只表示年份部分,DATE 类型可以完整表示一个日期。由于日期通常与时间相关联,DATETIME 和 TIMESTAMP 类型允许我们将日期与具体时间组合起来。如果仅需表示某个时间点,MySQL 还提供了 TIME 类型来满足这一需求。
字符串型数据类型
MySQL 提供了八种不同的数据类型用于表示字符串。我们已经学习过其中一种,即 TEXT。TEXT 可以存储最长为 65,535 字节的字符串数据,类似于 BLOB。不过,BLOB 类型用于存储二进制字符串,即由 0 和 1 组成的数据。与 TEXT/BLOB 相对应的是 CHAR/VARCHAR 和 BINARY/VARBINARY,它们分别用于存储固定长度和最大长度的非二进制及二进制字符串。CHAR 和 VARCHAR 都需指定最大长度。其中,CHAR 会将较短的字符串用空格右填充至指定长度;而 VARCHAR 在存储时不进行填充,仅在插入时保留尾部空格以便后续检索原始值。BINARY/VARBINARY 的行为与此类似,但针对的是二进制字符串。
空间型数据类型
1-- 创建用于示例汽车型号的临时表。 2DROP TABLE IF EXISTS CarModel; 3CREATE TEMPORARY TABLE CarModel 4( 5 id INT AUTO_INCREMENT, 6 name TEXT DEFAULT NULL, 7 `power (kW)` INT DEFAULT NULL, 8 `release year` YEAR DEFAULT NULL, 9 `assembly location` POINT DEFAULT NULL SRID 4326, 10 PRIMARY KEY (id) 11); 12 13-- 创建一辆汽车模型,假设其装配工厂位于德国沃尔夫斯堡的大众工厂。 14INSERT INTO CarModel (name, `power (kW)`, `release year`, `assembly location`) 15VALUES ('Golf VII', 92, 2012, ST_PointFromText('POINT(52.4363146 10.7665937)', 4326)); 16 17-- 查询汽车装配地点的纬度和经度。 18SELECT ST_X(`assembly location`) AS Latitude, ST_Y(`assembly location`) AS Longitude 19FROM CarModel;
除了上述示例外,MySQL 还支持八种不同的空间数据类型,用于存储单个值(如 LINESTRING)或多个值的集合(如 MULTIPOLYGON)。
JSON 类型
在五类数据类型中,JSON 类型因其在 Web 开发中的广泛应用而尤为值得关注。MySQL 对 JSON 的原生支持使得数据库系统在 Web 技术栈中更具吸引力。
MySQL 的 JSON 数据类型对 JSON 的原生支持意味着 JSON 文档并非以字符串形式存储,而是被解析并以优化的格式进行存储。借助此功能,我们可以像在其他编程语言中一样,使用简单的字符串或 SQL 函数(如 JSON_ARRAY 和 JSON_OBJECT)来创建 JSON 文档。例如,基于前文定义的汽车型号,我们也可以使用 JSON 文档的形式来表示它:
1-- 创建用于示例汽车型号的临时表。 2DROP TABLE IF EXISTS CarModel; 3CREATE TEMPORARY TABLE CarModel 4( 5 id INT AUTO_INCREMENT, 6 car JSON DEFAULT NULL, 7 PRIMARY KEY (id) 8); 9 10-- 将一辆汽车模型以 JSON 文档形式插入。 11INSERT INTO CarModel (car) VALUES ('{ "name": "Golf VII", "power (kW)": 92, "release year": 2012 }'); 12 13-- 从 JSON 文档中提取汽车型号的名称。 14SELECT car->"$.name" AS `Model Name` FROM CarModel;