数据类型
- 一、分类
- 二、数值类型
- 1、介绍
- 2、示例
- 三、float
- 1、语法
- 2、介绍
- 3、特点与注意事项
- 四、decimal
- 1、语法
- 2、介绍
- 3、精度与范围
- 4、存储与性能
- 5、示例
- 五、char
- 1、介绍
- 2、示例
- 六、varchar
- 1、介绍
- 2、注意事项
- 3、示例
- 七、日期和时间类型
- 1、DATE类型
- 2、DATETIME类型
- 3、TIMESTAMP类型
- 八、字符串类型
- 1、ENUM类型
- (1)语法
- (2)介绍
- 2、SET类型
- (1)语法
- (2)介绍
- 3、注意事项
- 九、find_in_set
- 1、语法
- 2、介绍
- 3、返回值
- 4、示例
一、分类
二、数值类型
1、介绍
- 在MySQL中,整型默认是有符号的。但可以通过UNSIGNED来说明某个字段是无符号的。
- 虽然类型可以指定为无符号的,但是尽量不要使用unsigned,除了明确知道存储的数据是无符号的情况。因为,对于有符号类型可能存放不下的数据,无符号的该类型同样可能存放不下。与其如此,不如在设计时,将该类型提升为能存储更大数据的类型。
- 当插入的数据超出范围或者是错误的时候,MySQL将阻止插入操作。
2、示例
unsigned
三、float
1、语法
float[(m, d)] [unsigned]
2、介绍
- float是一种单精度浮点数类型,用于存储需要小数表示的数值。适用于存储对精度要求不是特别高的浮点数数据,如科学计算、统计分析、图形处理等。即float类型是一种用于存储近似数值数据的浮点数类型,当插入数据时,可能会丢失精度(四舍五入)。
- float类型通常占用4个字节的存储空间。表示范围依赖于其精度和指数部分。具体来说,它可以表示的数值范围非常广泛,但精度有限。
3、特点与注意事项
- 近似表示:float类型存储的数值是近似值,不是精确值。因此,在进行数值比较或计算时,需要注意可能的精度损失。
- 默认宽度:在 MySQL 中,float类型的宽度(即显示的位数)是可选的,并且这个宽度并不限制数值的存储范围或精度。它主要用于在显示数值时指定格式。
- 小数位数:小数位数是可选的,并且不影响数值的存储或精度。它主要用于在显示数值时指定小数点后的位数。
- 类型转换:在将其他数据类型转换为float类型时,可能会发生精度损失或溢出。
四、decimal
1、语法
decimal(m, d) [unsigned]
2、介绍
- DECIMAL类型在MySQL中用于存储精确的带小数点的十进制数字。即它是一种用于存储定点小数的高精度数据类型。常用于需要高精度计算的场景。因此,DECIMAL类型提供了比FLOAT和DOUBLE类型更可靠的数值存储和计算。
3、精度与范围
- 精度:DECIMAL类型的精度由两个参数指定:M(总位数,包括整数部分和小数部分)和D(小数位数)。
- 范围:DECIMAL类型允许存储的值范围很大,具体取决于M和D的值。理论上,DECIMAL类型的值范围可以从-10(M-D+1)到10(M-D+1)-1(不考虑符号位)。然而,实际范围可能受到MySQL版本和配置的限制。
4、存储与性能
- 存储空间:DECIMAL类型的存储空间取决于M和D的值。与FLOAT和DOUBLE类型相比,DECIMAL类型可能需要更多的存储空间来存储高精度的数值。然而,在需要高精度计算的场景中,这种额外的存储空间是值得的。
- 性能:在处理大量数据时,DECIMAL类型的性能可能略低于FLOAT和DOUBLE类型。这是因为DECIMAL类型需要进行额外的计算和存储操作来保持精度。然而,在需要高精度计算的场景中,这种性能损失是可以接受的。
5、示例
五、char
1、介绍
- 在MySQL中,CHAR 是一种用于存储固定长度字符串的数据类型。即CHAR 类型的字段总是占用相同的存储空间,不管实际存储的字符串长度是多少。如果存储的字符串长度不足定义的长度,MySQL 会用空格填充。
- CHAR 字段可以使用不同的字符集和排序规则,而字符集和排序规则决定了存储的字符及其比较方式,即可能会影响查询结果
- 由于 CHAR 是固定长度的,存储和检索时可能会更高效,尤其是在字符串长度相对固定的情况下。但如果实际存储的字符串长度变化较大,使用 CHAR 可能会导致存储空间浪费。
- CHAR 字段的最大长度是255个字符。使用场景有存储长度固定的字符串、需要性能优化的场景、需要字符填充的场景。
2、示例
- 在MySQL中,CHAR 存储是按字符计算的,而中文字符也是字符,其被认为是和普通字符一样大小,而不是用存储的字节大小进行计算。
六、varchar
1、介绍
- 在MySQL中,VARCHAR 是一种用于存储可变长度字符串的数据类型。VARCHAR 类型的字符串在存储时,只占用实际字符串长度加上一个额外的字节(或两个字节,取决于最大长度)来记录字符串长度。这意味着 VARCHAR 可以更有效地利用存储空间,因为它只分配实际所需的空间。
- VARCHAR 类型的最大长度可以达到65535个字符,但实际可用的最大长度受到行大小和其他字段的限制。当创建表时,需要指定 VARCHAR 列的最大长度,例如VARCHAR(255)表示该列可以存储最多255个字符的字符串。
- VARCHAR 字段可以使用不同的字符集和排序规则,这些设置决定了存储的字符及其比较方式。例如,在 UTF8 字符集下,每个字符最多占用3个字节。VARCHAR 类型的字符串在存储时,会使用可变长度的字符编码。这意味着存储的字节数可能会根据字符集和字符串的实际内容而变化。
2、注意事项
- 索引效率:VARCHAR 列上的索引可能不如固定长度类型(如 CHAR)高效,因为数据的长度可变。这可能会导致在某些查询场景下性能下降。
- 碎片化:由于数据长度可变,VARCHAR 列可能会导致数据库中产生“碎片”,这会降低查询性能。
3、示例
最大字节数测试
七、日期和时间类型
1、DATE类型
- DATE类型用于存储日期信息,不包含时间部分。其格式为’YYYY-MM-DD’,其中YYYY表示年份,MM表示月份,DD表示日期。
- DATE类型通常占用3个字节的存储空间。可以存储从’1000-01-01’到’9999-12-31’之间的日期。常用于记录生日、注册日期、合同生效日期等只包含日期的信息。
2、DATETIME类型
- DATETIME类型用于存储日期和时间信息,提供秒级的精度。其格式为’YYYY-MM-DD HH:MM:SS’,其中HH表示小时,MM表示分钟,SS表示秒。
- DATETIME类型通常占用8个字节的存储空间。可以存储从’1000-01-01 00:00:00’到’9999-12-31 23:59:59’之间的日期和时间。常用于记录需要同时包含日期和时间的信息,如订单的创建时间、支付时间等。
3、TIMESTAMP类型
- TIMESTAMP类型用于存储日期和时间信息,但它与DATETIME类型有一些关键的区别。其格式同样为’YYYY-MM-DD HH:MM:SS’。常用于记录数据的创建或修改时间,特别是在需要处理时区转换的场景中。
- TIMESTAMP类型通常占用4个字节。然而,从MySQL 8.0.19开始,TIMESTAMP类型默认使用6个字节的存储空间,以支持更高的精度和时区信息。
- TIMESTAMP类型的取值范围受到UTC时间的限制,从’1970-01-01 00:00:01’ UTC到’2038-01-19 03:14:07’ UTC。
- 时区处理:TIMESTAMP类型在存储时会将时间从当前时区转换为UTC时间进行存储,查询时再将UTC时间转换回当前时区。这意味着,对于不同时区中的客户端,检索到的TIMESTAMP值可能会有所不同。
- 自动初始化和更新:TIMESTAMP列可以设置为在插入或更新行时自动初始化为当前时间戳,或自动更新为当前时间戳。
八、字符串类型
1、ENUM类型
(1)语法
ENUM('value1', 'value2', ..., 'valueN')
- ‘value1’, ‘value2’, …, ‘valueN’:枚举类型允许的值。
(2)介绍
- 定义:ENUM类型用于限制字段只能取预定义的一组值中的一个。在创建表时,ENUM类型的取值范围以列表的形式指定。ENUM定义中的值顺序就是排序顺序,常用于存储性别、状态等有限且固定的选项。
- 存储:ENUM类型在数据库内部并不是用字符的方式存储的,而是使用一系列的数字。这些数字代表列表中每个值的顺序编号,从1开始。
- 取值范围:ENUM类型的取值列表中最多能有65535个值(实际上是65535-1,因为MySQL保留了一个错误成员,它是每个枚举的隐含成员,用数字0表示,若以字符串表示则为空串)。如果数据值列表在255个以内,那么一个字节就足够,如果超过255但是小于65535,那么系统采用两个字节保存。
- 默认值:如果ENUM类型加上了NOT NULL属性,其默认值为取值列表的第一个元素。如果不加NOT NULL属性,ENUM类型将允许插入NULL,而且NULL为默认值。
- 大小写敏感性:可按任意的大小写字符插入ENUM值,但是列定义中指定的字符串的大小写决定了以后检索它们时所需要使用的大小写(字符串)。
2、SET类型
(1)语法
SET('value1', 'value2', ..., 'valueN')
- ‘value1’, ‘value2’, …, ‘valueN’:是 SET 类型允许的值。
(2)介绍
- 定义:SET类型允许字段取一组预定义值中的零个或多个。在创建表时,SET类型的取值范围以列表的形式指定。常用于存储具有多个选项的属性,如兴趣爱好、技能等。
- 存储:SET类型在数据库内部同样不是用字符的方式存储的,而是使用一系列的二进制位。每个成员对应SET值中的一个二进制位,第一个集合成员对应于0位,第二个成员对应于1位,以此类推。
- 取值范围:SET类型的值最多只能是由64个元素构成的组合。这是因为SET会将选择的置1,没有选择的置0,而64个元素正好可以用64位(即8个字节)来存储。
- 值的表示:SET类型的值用逗号分隔的成员指定。在检索时,SET将使用列定义中使用的字母大小写来显示存储在列中的值。如果为列分配了字符集和排序规则,那么在为列分配值时需要考虑字母大小写。
3、注意事项
- 在使用ENUM和SET类型时,应谨慎修改枚举值或集合成员,因为修改后可能会导致位置关系发生变化,进而影响到存储和检索的结果。
- 不推荐用ENUM存数字和在SET中存储与成员不对应的数字值,因为可能会产生混淆和错误。
九、find_in_set
1、语法
FIND_IN_SET(search_string, string_list)
- search_string:要查找的字符串。
- string_list:逗号分隔的字符串列表。
2、介绍
- FIND_IN_SET函数是一个用于查找字符串在逗号分隔的字符串列表中的位置的函数。通常用于查找逗号分隔的字符串列表中是否包含某个值、实现多对多关系的简单查询和处理标签、分类等多值字段的场景。
- FIND_IN_SET函数无法使用索引,因此当操作大量数据时可能导致性能问题。对于大型的数据表,可以考虑将逗号分隔的字符串存储为多个列,每个列存储一个值,以便使用标准的索引来进行查询,提高查询效率。
- FIND_IN_SET函数对大小写敏感。如果需要进行不区分大小写的比较,可以使用LOWER或UPPER函数将字符串转换为小写或大写后再进行比较。在使用FIND_IN_SET函数时,应确保string_list为逗号分隔的字符串。
3、返回值
- 如果search_string在string_list中,则返回search_string在string_list中的位置(从1开始)。
- 如果search_string不在string_list中,或者string_list是空字符串,则返回0。
- 如果任一参数为NULL,则返回值为NULL。
4、示例
CREATE TABLE users (id INT PRIMARY KEY,colors VARCHAR(255)
);INSERT INTO users (id, colors) VALUES
(1, '1,2,3'),
(2, '2,4'),
(3, '3,5,6'),
(4, '');SELECT * FROM users WHERE FIND_IN_SET('3', colors) > 0;
- 假设有一个名为users的表,存储了用户的ID和喜欢的颜色,颜色以逗号分隔的字符串形式存储。
- 想要查找喜欢颜色为3的用户,则使用上方最后一条SQL查询语句。执行该查询语句后,将返回ID为1和3的用户。
本文到这里就结束了,如有错误或者不清楚的地方欢迎评论或者私信
本文只是在学习过程中所做的总结,不会涉及过深的概念
创作不易,如果觉得博主写得不错,请点赞、收藏加关注支持一下💕💕💕