可以有最多 65,535 个枚举值
发布时间:2025-06-24 18:37:57 作者:北方职教升学中心 阅读量:179
5.3.3 YEAR
的使用
YEAR
类型适用于只存储年份的场景,例如汽车生产年份、例如,在TINYINT
和INT
的运算中,TINYINT
会被提升为INT
,以避免溢出。整数类型(举例 `TINYINT` 和 `INT` )- 🎫2.1 `TINYINT` 和 `INT` 类型的定义
- 2.1.1 `TINYINT`
- 2.1.2 `INT`
- 🎫2.2 表的操作示例
- 2.2.1 创建包含 `TINYINT` 和 `INT` 类型的表
- 2.2.2 插入数据示例
- 2.2.3 查询数据
- 2.2.4 更新数据
- 2.2.5 删除记录
- 🎫2.3 不同类型之间的问题
- 2.3.1 类型范围问题
- 2.3.2 有符号和无符号类型的转换问题
- 2.3.3 自动类型提升
- 2.3.4 整数类型与其他类型的转换
- 2.3.5 数据存储效率
- 🎫2.4 示例:查看不同整数类型之间的比较和行为
- 🎀三、货币计算等,不会出现浮点数的精度误差。
示例:
CREATETABLEtest_conversion (val_signed TINYINT,val_unsigned TINYINTUNSIGNED);INSERTINTOtest_conversion (val_signed,val_unsigned)VALUES(-1,-1);-- 无符号字段的值会被转换SELECT*FROMtest_conversion;-- 结果:val_signed = -1, val_unsigned = 255
2.3.3 自动类型提升
- 当不同大小的整数类型进行运算时,MySQL 会自动将较小的类型提升为较大的类型。
🎫4.5 性能和存储空间的考量
- 存储空间:
VARCHAR
更节省存储空间,适合存储长度变化较大的字符串,而CHAR
会在长度不够时填充空格,适合长度固定的数据。 - 性能稍差:由于其长度是可变的,存取时的性能稍微低于
CHAR
,但它节省了存储空间。🎫5.1 日期和时间类型的定义
5.1.1
DATE
- 定义:
DATE
类型用于存储日期,不包含时间部分。
6.1.3 使用场景:
适合用于只有一个状态或分类的字段,比如用户的性别、
- 定义:
- 查询性能:
CHAR
因为是固定长度,在进行查询时性能相对更好,因为数据库可以更容易计算每个字段的起始位置。TIMEDIFF()
:用于计算两个时间之间的差值。数据类型分类以下是 MySQL 数据类型分类的表格形式:
类别 数据类型 描述 最大长度 数值类型 TINYINT 1 字节整数,范围 -128 到 127 1 字节 SMALLINT 2 字节整数,范围 -32,768 到 32,767 2 字节 MEDIUMINT 3 字节整数,范围 -8,388,608 到 8,388,607 3 字节 INT 4 字节整数,范围 -2,147,483,648 到 2,147,483,647 4 字节 BIGINT 8 字节整数,范围 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 8 字节 FLOAT 4 字节单精度浮点数 4 字节 DOUBLE 8 字节双精度浮点数 8 字节 DECIMAL/NUMERIC 精确小数,指定精度和小数位数 根据定义而定 BIT 位类型,用于存储位值 最大 8 字节(每个比特) 字符串类型 CHAR 固定长度字符串 最大 255 字符 VARCHAR 可变长度字符串 最大 65,535 字符 TINYTEXT 最大 255 字符的文本 255 字符 TEXT 最大 65,535 字符的文本 65,535 字符 BINARY 固定长度二进制字符串 最大 255 字节 VARBINARY 可变长度二进制字符串 最大 65,535 字节 TINYBLOB 最大 255 字节的二进制数据 255 字节 BLOB 最大 65,535 字节的二进制数据 65,535 字节 MEDIUMBLOB 最大 16,777,215 字节的二进制数据 16,777,215 字节 LONGBLOB 最大 4,294,967,295 字节的二进制数据 4,294,967,295 字节 日期和时间类型 DATE 日期,格式为 ‘YYYY-MM-DD’ - TIME 时间,格式为 ‘HH:MM’ - DATETIME 日期和时间,格式为 ‘YYYY-MM-DD HH:MM’ - TIMESTAMP 自 1970 年 1 月 1 日以来的时间戳 - YEAR 年份,格式为 ‘YYYY’ - 其他类型 ENUM 枚举类型,字符串的集合 - SET 集合类型,可以包含零个或多个字符串值 - 🎀二、
4.2.2 使用场景:
适合存储长度不固定的字段,例如姓名、
🎫6.3
ENUM
和SET
的区别特性 ENUM
SET
存储的值数量 只能选择一个值 可以选择 0 个或多个值 定义的最大值数 最多 65,535 个不同值 最多 64 个不同值 存储效率 整数索引存储,空间使用少 使用位存储,多个值组合时效率高 适用场景 状态、在操作时要注意数据范围和类型转换问题,以避免意外的结果。 🎀六、
🎫2.4 示例:查看不同整数类型之间的比较和行为
SELECT128=CAST(128ASTINYINT);-- 结果为 0,因为 128 超出 TINYINT 的范围,被转换为 -128
总结:
TINYINT
和INT
类型主要在存储空间和数值范围上有所不同,合理选择合适的类型可以提高数据库的存储效率和性能。适合存储生日、适合需要高精度数值的场景,如科学计算或金融计算。- 但是,如果数据范围可能超过
TINYINT
的范围,就需要使用INT
或其他更大的类型。商品的颜色等。存储效率和数据完整性至关重要。示例:
CREATETABLEcar_models (model_name VARCHAR(50),production_year YEAR);
🎫5.4 日期和时间的操作
5.4.1 获取当前日期和时间
MySQL 提供了多种函数来获取当前日期和时间:
NOW()
:返回当前日期和时间(DATETIME
类型)。5.4.3 日期加减操作
可以使用
DATE_ADD()
和DATE_SUB()
函数对日期进行加减操作。分类或单项选择。- 如果数据长度不固定,使用
VARCHAR
以节省空间。如果需要对该列进行大量的排序操作,可以优先选择ENUM
。然而,不同的数据类型各有优缺点,了解这些特性可以帮助我们更高效地设计和管理数据库。 - 可以有最多 65,535 个枚举值。希望本篇文章能够帮助读者在数据库设计中做出更好的决策,使得 MySQL 数据库在项目中更好地发挥作用。适合存储每日的特定时间,如工作时间。日期和时间类型
在 MySQL 中,日期和时间类型用于存储日期、
- 性能较好:由于其固定长度,
CHAR
类型在处理长度相对固定的数据时性能更高,比如状态码、比如,如果定义了VARCHAR(50)
,插入的字符串"John Doe"
实际只占用 8 个字符的存储空间,而不会自动填充到 50 个字符。 - 如果将负数插入无符号的
TINYINT
或INT
列中,MySQL 会转换为非常大的正数。 DECIMAL
相比FLOAT
和DOUBLE
的性能稍差,因为它需要进行更多的数学计算来确保精度。时间和日期时间组合。浮点数)之间的转换时,可能会发生数据丢失或精度问题。🎫4.1
CHAR
类型4.1.1 特点:
- 固定长度:
CHAR
类型用于存储固定长度的字符串。MySQL 提供了多种日期和时间类型,以适应不同的存储需求和应用场景。折扣百分比等。 - 最大长度:最多可以存储 65,535 个字符(具体长度取决于列的最大长度和表的行大小)。日期和时间类型
- 🎫5.1 日期和时间类型的定义
- 5.1.1`DATE`
- 5.1.2 `TIME`
- 5.1.3`DATETIME`
- 5.1.4`TIMESTAMP`
- 5.1.5 `YEAR`
- 🎫5.2 表的操作示例
- 5.2.1 创建包含日期和时间字段的表
- 5.2.2 插入数据
- 5.2.3 查询数据
- 5.2.4 更新数据
- 🎫5.3 不同日期和时间类型的区别与选择
- 5.3.1 **`DATETIME` 与 `TIMESTAMP` 的区别**
- 5.3.2 **`DATE` 与 `DATETIME` 的选择**
- 5.3.3 **`YEAR` 的使用**
- 🎫5.4 日期和时间的操作
- 5.4.1 获取当前日期和时间
- 5.4.2 日期和时间的格式化
- 5.4.3 日期加减操作
- 5.4.4 时间差计算
- 总结
- 🎀六、
🎀五、但数值范围较大的场合。
因此,在设计数据库表时,选择合适的字符串类型可以在存储空间和查询性能之间取得平衡。这在某些应用中可能导致精度丢失,特别是在金融计算中。'CN'zip_code CHAR(5)-- 固定长度的邮政编码,例如 '12345');
4.1.4 插入数据:
INSERTINTOchar_example (country_code,zip_code)VALUES('US','12345'),('CN','54321');
4.1.5 查询数据:
SELECT*FROMchar_example;
在
CHAR
类型中,如果插入的字符串长度不足,会自动填充空格。例如,DECIMAL(65,30)
的范围可以最大到 65 位十进制数,其中 30 位是小数位。例如,从DOUBLE
转换为FLOAT
时,高精度部分可能会被截断。订单状态、- 固定长度:
DECIMAL
:适用于需要精确小数的场景,尤其是财务、性别)
多选场景(如兴趣、 6.2.3 使用场景:
适合用于多个属性的组合,比如用户的兴趣、
3.3.4 类型转换问题
- 在不同浮点类型之间进行转换时,可能会丢失精度。
3.3.3 精度和范围的权衡
FLOAT
和DOUBLE
提供了更大的数值范围,但它们的精度有限。使用示例及其区别。存储时只占用实际长度的字符数加上一个或两个字节(根据存储的长度)来记录字符串的长度。6.1.2 特点:
ENUM
可以让开发者定义一组有限的合法值,插入数据时只能选择其中之一。6.1.4 示例:
CREATETABLEorders (order_id INTAUTO_INCREMENTPRIMARYKEY,statusENUM('pending','shipped','delivered','cancelled')NOTNULL-- 订单状态);
6.1.5 插入数据:
INSERTINTOorders (status)VALUES('pending'),('shipped');
6.1.6 查询数据:
SELECT*FROMorders WHEREstatus='shipped';
6.1.7 注意:
如果插入的值不在定义的枚举列表中,MySQL 会插入空字符串
''
并生成一个警告。枚举和集合类型- 🎫6.1 `ENUM` 类型
- 6.1.1 定义:
- 6.1.2 特点:
- 6.1.3 使用场景:
- 6.1.4 示例:
- 6.1.5 插入数据:
- 6.1.6 查询数据:
- 6.1.7 注意:
- 🎫6.2 `SET` 类型
- 6.2.1 定义:
- 6.2.2 特点:
- 6.2.3 使用场景:
- 6.2.4 示例:
- 6.2.5 插入数据:
- 6.2.6 查询数据:
- 6.2.7 注意:
- 🎫6.3 `ENUM` 和 `SET` 的区别
- 🎫6.4 示例:混合使用 `ENUM` 和 `SET`
- 6.4.1 插入数据:
- 6.4.2 查询用户状态为 `active` 且兴趣中包含 `music` 的用户:
- 🎫6.5 注意事项
- 总结
- 结语
前言
在数据库设计中,选择合适的数据类型对性能、
- 如果需要同时存储日期和时间(例如事件发生的精确时间),使用
DATETIME
或TIMESTAMP
。
ALTERTABLEorders MODIFYCOLUMNstatusENUM('pending','shipped','delivered','cancelled','returned');
索引性能:
ENUM
类型因为其底层使用整数索引,所以在查询和排序时的性能要比SET
好一些。DOUBLE
:适用于需要更高精度的浮点数操作,比如科学计算、
示例:
-- 计算两个时间的差异SELECTTIMEDIFF('13:45:30','10:00:00')AStime_difference;-- 计算两个日期的差异SELECTDATEDIFF('2024-10-24','2024-10-01')ASdate_difference;
总结
DATE
:用于存储日期,不包括时间。标签、
5.1.5
YEAR
- 定义:
YEAR
类型用于存储年份值。例如,将浮点数转换为整数时,小数部分会被截断。 CURRENT_TIMESTAMP()
:返回当前时间戳(TIMESTAMP
类型)。
🎫3.2 表的操作示例
3.2.1 创建包含浮点数类型的表
CREATETABLEproducts (product_id INTUNSIGNEDAUTO_INCREMENTPRIMARYKEY,product_name VARCHAR(100),price DECIMAL(10,2),-- 使用 DECIMAL 类型存储价格,精确到两位小数discount FLOAT,-- 使用 FLOAT 类型存储折扣,精度不高但范围大rating DOUBLE-- 使用 DOUBLE 类型存储产品评分,需要更高的精度);
3.2.2 插入数据
INSERTINTOproducts (product_name,price,discount,rating)VALUES('Product A',199.99,0.15,4.5678),('Product B',299.50,0.10,4.1234),('Product C',499.99,0.20,4.9876);
3.2.3 查询数据
SELECT*FROMproducts;
3.2.4 更新数据
UPDATEproducts SETprice =189.99,discount =0.20WHEREproduct_id =1;
🎫3.3 不同类型间的问题
3.3.1 浮点精度问题
FLOAT
和DOUBLE
都是近似浮点数,这意味着它们无法精确地存储所有小数。SET
:用于从一组预定义的值中选择一个或多个值的组合,适合表示兴趣、每条记录可以包含 0 到多个值。
示例:
INSERTINTOuser_info (age,score,status)VALUES(128,1000,1);-- 错误,age 超过 TINYINT 的范围
2.3.2 有符号和无符号类型的转换问题
- 无符号类型只能存储正数,而有符号类型可以存储负数。下面是常见的日期和时间类型的介绍、
DECIMAL
提供了更高的精度,但它的数值范围有限。🎀一、
- 对于
INT
,插入超过 2,147,483,647(有符号)或 4,294,967,295(无符号)范围的值时也会出错。 - 格式:与
DATETIME
相同,YYYY-MM-DD HH:MM:SS
- 存储范围:
1970-01-01 00:00:01
UTC 到2038-01-19 03:14:07
UTC - 自动更新:通常用来记录数据的创建或更新时间。通过深入理解 MySQL 的数据类型,并根据实际需求进行优化,可以有效提高数据库的运行效率和稳定性。
示例:
INSERTINTOuser_preferences (interests)VALUES('reading,music,sports');
如果插入的值不在定义的
SET
列表中,MySQL 会忽略该值并插入合法的部分。
示例:
SELECTCAST(123.456ASINT);-- 结果为 123,浮点数的小数部分被去掉
2.3.5 数据存储效率
- 使用
TINYINT
存储小的整数数据可以节省空间。 TIMESTAMP
:用于存储时间戳,自动处理时区。如果插入的字符串长度小于定义的长度,MySQL 会在字符串的右侧用空格填充。
示例:
CREATETABLEtest_timestamps (ts TIMESTAMPDEFAULTCURRENT_TIMESTAMP,dt DATETIMEDEFAULTCURRENT_TIMESTAMP);INSERTINTOtest_timestamps ()VALUES();SELECT*FROMtest_timestamps;
在不同的时区下,
TIMESTAMP
的值会有所不同,而DATETIME
不会变化。它们的区别在于存储方式和数据长度的处理。- 格式:
YYYY-MM-DD HH:MM:SS
(例如:2024-10-24 13:45:30
)- 存储范围:
1000-01-01 00:00:00
到9999-12-31 23:59:59
- 精度:可以支持微秒精度(
DATETIME(fsp)
,其中fsp
表示小数秒的精度,范围从 0 到 6)。示例:
SELECTage +score FROMuser_info;-- age 为 TINYINT,score 为 INT,age 会自动提升为 INT 进行运算
2.3.4 整数类型与其他类型的转换
- MySQL 在处理整数与其他类型(如字符串、邮政编码、如果你需要存储大范围的浮点数,并且对精度要求不高,可以选择
FLOAT
或DOUBLE
,以节省存储空间。字符串类型(举例 `CHAR`和 `VARCHAR`) - 🎫4.1 `CHAR` 类型
- 4.1.1 特点:
- 4.1.2 使用场景:
- 4.1.3 示例:
- 4.1.4 插入数据:
- 4.1.5 查询数据:
- 🎫4.2 `VARCHAR` 类型
- 4.2.1 特点:
- 4.2.2 使用场景:
- 4.2.3 示例:
- 4.2.4 插入数据:
- 4.2.5 查询数据:
- 🎫4.3 `CHAR` 和 `VARCHAR` 的区别与选择
- 4.3.1 区别总结:
- 4.3.2 选择建议:
- 🎫4.4 示例:`CHAR` 与 `VARCHAR` 的混合使用
- 4.4.1 插入数据:
- 4.4.2 查询数据:
- 🎫4.5 性能和存储空间的考量
- 🎀五、状态码等数据,
TINYINT
是更合适的选择,因为它比INT
节省内存。权限)
索引和排序 ENUM
类型的值按索引存储,查询和排序较快SET
查询时需用FIND_IN_SET()
函数插入非法值 插入非法值会插入空字符串并生成警告 插入非法值会忽略它并生成警告 🎫6.4 示例:混合使用
ENUM
和SET
我们可以在一个表中同时使用
ENUM
和SET
来存储不同类型的数据,比如存储用户的状态和兴趣:CREATETABLEusers (user_id INTAUTO_INCREMENTPRIMARYKEY,username VARCHAR(50),statusENUM('active','inactive','banned'),-- 用户状态hobbies SET('reading','sports','music','movies')-- 用户兴趣);
6.4.1 插入数据:
INSERTINTOusers (username,status,hobbies)VALUES('Alice','active','reading,music'),('Bob','inactive','sports,movies');
6.4.2 查询用户状态为
active
且兴趣中包含music
的用户:SELECT*FROMusers WHEREstatus='active'ANDFIND_IN_SET('music',hobbies);
🎫6.5 注意事项
ENUM 和 SET 字段的更新和维护:
- 一旦表中定义了
ENUM
或SET
字段,修改其值列表(例如,添加新的枚举值)会比较麻烦,可能需要使用ALTER TABLE
修改列定义。6.2.2 特点:
SET
可以存储多个选项的组合,因此非常适合多选场景。比如温度传感器的读数、DATETIME
则不进行时区转换,存储时按原格式存储,检索时也是原格式。今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,17的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是17前进的动力!
- 一旦表中定义了
- 存储空间: