MySQL有哪些数据类型?MySQL 数据类型是数据库设计中非常基础和重要的概念,选择合适的数据类型对于优化存储空间、提升查询性能和数据准确性都至关重要。
MySQL 数据类型主要分为三大类:数值类型、字符串(文本)类型、日期/时间类型。此外,还有两种现代且常用的特殊类型。
数值类型用于存储数字,分为整数类型和浮点数(小数)类型。
-
整数类型 整数类型可选 UNSIGNED 属性,表示无符号(仅非负数),这样可以使正数的范围扩大一倍。
最佳实践:选择类型时,在满足需求的前提下尽可能使用最小的数据类型。例如,age 字段用 TINYINT UNSIGNED 就足够了。
-
浮点数类型 (近似值) 用于存储近似值的小数,计算时可能会有精度损失。
-
定点数类型 (精确值) 用于存储精确的小数值,如财务数据、货币计算。
FLOAT/DOUBLE vs DECIMAL:追求性能(计算速度)用 FLOAT/DOUBLE,追求精确性(无舍入误差)用 DECIMAL。
字符串类型用于存储文本、二进制数据(如图片、文件)等。
-
短文本与二进制字符串
CHAR vs VARCHAR:长度固定用 CHAR,长度变化大用 VARCHAR。
-
长文本与二进制字符串 (BLOB & TEXT) 这些类型用于存储大型数据。BLOB 系列存储二进制数据,TEXT 系列存储字符文本数据。
注意:通常不建议将大型文件直接存入数据库,而是将文件存储在文件系统或对象存储(如AWS S3)中,然后在数据库中只保存文件的路径或URL。
DATETIME vs TIMESTAMP: 需要范围更大、与时区无关,用 DATETIME。 需要自动记录行更新时间、节省空间、与时区相关,用 TIMESTAMP。常定义为 UPDATE CURRENT_TIMESTAMP。
-
JSON 类型 (MySQL 5.7.8+) 用于存储 JSON 格式的数据,MySQL 提供了自动验证 JSON 格式和一系列便捷的 JSON 查询函数。
CREATE TABLE user ( id INT, profile JSON -- 存储用户的JSON配置信息 ); INSERT INTO user VALUES (1, '{"name": "John", "hobbies": ["reading", "coding"]}');
-
空间数据类型 (GIS) 用于存储地理信息数据,如点、线、多边形等。例如 GEOMETRY, POINT, POLYGON。
-
更小通常更好:在满足需求的前提下,选择占用空间最小的数据类型。它们通常更快,占用更少的磁盘和内存。
-
简单就好:整型比字符操作更简单。例如,用 INT 存储 IP 地址不如用MySQL提供的 INET_ATON() 和 INET_NTOA() 函数将其转换为无符号整型存储。
-
避免使用 NULL:尽量定义字段为 NOT NULL。除非必要,因为可为 NULL 的列使索引和值处理更复杂,且占用更多空间。
-
字符集选择:对于中文等非拉丁字符,通常使用 utf8mb4 字符集(真正完整的UTF-8支持,utf8 在MySQL中并非完整的UTF-8)。
CREATE TABLE `users` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, -- 无符号自增主键 `username` VARCHAR(50) NOT NULL UNIQUE, -- 变长用户名 `age` TINYINT UNSIGNED NULL, -- 小范围无符号年龄 `balance` DECIMAL(10, 2) NOT NULL DEFAULT '0.00', -- 精确的账户余额 `avatar_url` VARCHAR(255) NULL, -- 存储头像链接,而非图片本身 `status` ENUM('active', 'inactive', 'banned') NOT NULL DEFAULT 'active', -- 枚举状态 `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 自动记录创建时间 `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 自动更新 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
另外搭配便捷的MYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。