常用字段类型 / 列类型 / 数据类型
MySQL 中的数据类型
类型 | 类型举例 |
整数类型 | TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT |
浮点类型 | FLOAT、DOUBLE |
定点数类型 | DECIMAL |
位类型 | BIT |
日期时间类型 | YEAR、TIME、DATE、DATETIME、TIMESTAMP |
文本字符串类型 | CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT |
枚举类型 | ENUM |
集合类型 | SET |
二进制字符串类型 | BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB |
JSON 类型 | JSON 对象、JSON 数组 |
空间数据类型 |
单值类型:GEOMETRY、POINT、LINESTRING、POLYGON 集合类型:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION |
常见数据类型的属性
MySQL 关键字 | 含义 |
NULL | 数据列可包含 NULL 值 |
NOT NULL | 数据列不允许包含 NULL 值 |
DEFAULT | 默认值 |
PRIMARY KEY | 主键 |
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号 |
CHARACTER SET name | 指定一个字符集 |
整数类型
类型 | 占用空间(byte) | 带符号 | 无符号 |
TINYINT | 1 | -27 ~ 27 - 1 | 0 ~ 28 - 1 |
SMALLINT | 2 | -215 ~ 215 - 1 | 0 ~ 216 - 1 |
MEDIUMINT | 3 | -223 ~ 223 - 1 | 0 ~ 224 - 1 |
INT(INTEGER) | 4 | -231 ~ 231 - 1 | 0 ~ 232 - 1 |
BIGINT | 8 | -263 ~ 263 - 1 | 0 ~ 264 - 1 |
(1)默认带符号,定义无符号,在类型后加上 UNSIGNED
(2)使用规范:满足需求情况下,尽量选择字节占用空间小的类型
1、可选类型
(1)M
(2)UNSIGNED
(3)ZEROFILL
2、M
(1)可选类型
(2)表示显示宽度,取值范围:(0, 255),如:int(5):当数据宽度小于 5 位的时候在数字前面需要用字符填满宽度
(3)该项功能需要配合 ZEROFILL 使用,表示用 0 填满宽度,否则指定显示宽度无效
(4)如果设置显示宽度,插入的数据宽度超过显示宽度限制,不会对插入的数据有任何影响,还是按照类型的实际宽度进行保存,即显示宽度与类型可以存储的值范围无关
(5)从 MySQL 8.0.17 开始,整数数据类型不推荐使用显示宽度属性
(6)整型数据类型可以在定义表结构时,指定所需要的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度值,默认显示宽度与其有符号数的最小值的宽度相同
2、UNSIGNED
(1)无符号类型(非负)
(2)所有的整数类型都有一个可选的属性UNSIGNED(无符号属性),无符号整数类型的最小取值为 0
(3)如果需要在 MySQL 数据库中保存非负整数值时,可以将整数类型设置为无符号类型
(4)默认带符号
3、ZEROFILL
(1)0 填充
(2)如果某列是 ZEROFILL,则 MySQL 会自动为当前列添加 UNSIGNED 属性
(3)如果指定 ZEROFILL,不够 M 位时,用 0 在左边填充,如果超过 M 位,只要不超过数据存储范围即可
(4)例:在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(3)、int(4)、int(8) 在磁盘上都是占用 4 bytes 的存储空间
(5)nt(M),必须和 UNSIGNED ZEROFILL 一起使用才有意义,如果整数值超过 M 位,就按照实际位数存储。只是无须再用字符 0 进行填充
4、应用场景
(1)TINYINT:一般用于枚举数据,比如系统设定取值范围很小且固定的场景
(2)SMALLINT:可以用于较小范围的统计数据,比如统计工厂的固定资产库存数量等
(3)MEDIUMINT:用于较大整数的计算,比如车站每日的客流量等
(4)INT(INTEGER):取值范围足够大,一般情况下不用考虑超限问题,用得最多,比如商品编号
(5)BIGINT :只有当处理特别巨大的整数时才会用到,比如双十一的交易量、大型门户网站点击量、证券公司衍生产品持仓等
5、使用规范
(1)在评估使用整数类型时,需要考虑存储空间、可靠性的平衡问题
(2)在实际工作中,系统故障产生的成本,远远超过增加几个字段存储空间所产生的成本
(3)首先确保数据不会超过取值范围,在这个前提之下,再考虑如何节省存储空间
浮点类型
1、FLOAT
(1)单精度浮点数
(2)占用 4 bytes
(3)有符号的取值范围:-3.402823466E+38~-1.175494351E-38、0、-1.175494351E-38~-3.402823466E+38
(4)无符号的取值范围:0、-1.175494351E-38~-3.402823466E+38
2、DOUBLE
(1)双精度浮点数
(2)占用 8 bytes
(3)有符号的取值范围:-1.7976931348623157E+308~-2.2250738585072014E-308、0、-2.2250738585072014E-308~-1.7976931348623157E+308
(4)无符号的取值范围:0、-2.2250738585072014E-308~-1.7976931348623157E+308
3、REAL
(1)默认为 DOUBLE
(2)如果 SQL 模式设定为启用 REAL_AS_FLOAT,则 MySQL 认为 REAL 是 FLOAT
(3)如果要启用 REAL_AS_FLOAT,可以通过以下 SQL 语句实现
SET sql_mode = “REAL_AS_FLOAT”;
4、浮点数类型的无符号数取值范围,是有符号数取值范围的一半,即有符号数取值范围大于等于零的部分
(1)MySQL 存储浮点数的格式为:符号(S)、尾数(M)、阶码(E)
(2)无论有没有符号,MySQL 浮点数都会存储表示符号的部分
数据精度
1、对于浮点类型,在 MySQL 中单精度值使用 4 个字节,双精度值使用 8 个字节
2、MySQL 允许使用非标准语法
(1)FLOAT(M, D)、DOUBLE(M, D),M 为精度 ,D 为标度,M=整数位+小数位,D=小数位,D<=M<=255,0<=D<=30
(2)其他数据库未必支持,涉及到数据迁移,则不建议使用
(3)FLOAT、DOUBLE 在不指定 (M, D) 时,默认按照实际的精度显示(由实际硬件和操作系统决定)
3、浮点类型允许加 UNSIGNED ,但是不会改变数据范围
4、不管是否显式设置精度 (M, D),MySQL 处理方案如下
(1)如果存储时,整数部分超出范围,MySQL 报错,不允许存储值
(2)如果存储时,小数点部分若超出范围,分以下情况
(3)若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作,并四舍五入删除多余的小数位后保存
(4)若四舍五入后,整数部分超出范围,则 MySQL 报错,并拒绝处理
5、MySQL 8.0.17
(1)FLOAT(M, D)、DOUBLE(M, D) 在官方文档中明确不推荐使用,将来可能被移除
(2)关于浮点型 FLOAT、DOUBLE 的 UNSIGNED 不推荐使用,将来可能被移除
6、精度误差
(1)采用二进制方式存储浮点类型
(2)如果尾数不是 0 或 5,则无法用一个二进制数来精确表达,只能在取值允许的范围内进行四舍五入
(3)浮点数是不准确的,要避免使用 = 来判断两个数是否相等
定点数类型
类型 | 占用字节数 | 有效范围 |
DECIMAL(M,D),DEC,NUMERIC | M+2 | 由 M、D 决定 |
1、使用 DECIMAL(M, D) 方式表示高精度小数
(1)M 为精度(最大位数),1 <= M <= 65
(2)D 为标度(小数),0 <= D <= 30
(3)D <= M
(4)最大取值范围与 DOUBLE 类型一样,但是有效数据范围由 M、D 决定
(5)存储空间不固定,由精度值 M 决定,总共占用的存储空间为 M+2 个字节
2、精度
(1)在 MySQL 内部是以字符串的形式进行存储,即一定是精准的
(2)当 DECIMAL 类型不指定精度和标度时,默认为 DECIMAL(10, 0)
(3)当数据精度超出定点数类型的精度范围时,则 MySQL 进行四舍五入处理
3、默认带符号,定义无符号,在类型后加上 UNSIGNED
空值
1、所有运算符或列值遇到 null 值,运算的结果都为 null
2、在 MySQL 中, 空值不等于空字符串,且占用空间
3、一个空字符串的长度为 0,而一个空值的长度为空
位类型
1、存储二进制值
二进制字符串类型 | 长度 | 长度范围 | 占用空间 |
BIT(M) | M | 1 <= M <= 64 | 约为 (M + 7) / 8 个字节 |
2、M 表示二进制的位数
(1)如果没有指定 (M),默认值 1
(2)1 <= M <= 64
3、按照十六进制显示;按照十进制添加
4、注意:在向 BIT 类型的字段中插入数据时,一定要确保插入的数据在 BIT 类型支持的范围内
日期与时间类型
类型 | 名称 | 字节 | 日期格式 | 最小值 | 最大值 |
YEAR | 年 | 1 | YYYY 或 YY | 1901 | 2155 |
TIME | 时间 | 3 | HH:MM:SS | -838:59:59 | 838:59:59 |
DATE | 日期 | 3 | YYYY-MM-DD | 1000-01-01 | 9999-12-03 |
DATETIME | 日期时间 | 8 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 | 9999-12-31 23:59:59 |
TIMESTAMP | 日期时间 | 4 | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:00 UTC | 2038-01-19 03:14:07 UTC |
YEAR
1、表示年份,占用 1个 字节
2、以 4 位字符串,或数字格式表示 YEAR 类型,其格式为 YYYY,最小值为 1901,最大值为 2155
3、以 2 位字符串格式表示 YEAR 类型,最小值为 00,最大值为 99
(1)当取值为 01 到 69 时,表示 2001 到 2069
(2)当取值为 70 到 99 时,表示 1970 到 1999
(3)当取值整数的 0 或 00 添加的话,则为 0000 年
(4)当取值是日期 / 字符串的 0 添加的话,则为 2000 年
4、版本
(1)MySQL 5.5.27 开始,2 位格式的 YEAR 不推荐使用,YEAR 默认格式 YYYY,不需要写成 YEAR(4)
(2)MySQL 8.0.19 开始,不推荐使用指定显示宽度的 YEAR(4) 数据类型
DATE
1、表示日期,没有时间部分
2、格式:YYYY-MM-DD
(1)YYYY:年份
(2)MM:月份
(3)DD:日期
3、占用 3 个字节
4、在向DATE类型的字段插入数据时,同样需要满足一定的格式条件
(1)以 YYYY-MM-DD,或 YYYYMMDD 表示的字符串日期,最小取值为 1000-01-01,最大取值为 9999-12-03,YYYYMMDD 会被转化为 YYYY-MM-DD
(2)以 YY-MM-DD,或 YYMMDD 表示的字符串日期,此格式中,年份为两位数值,或字符串满足 YEAR 类型的格式条件为:当年份取值为 00 到 69 时,转化为2000到2069;当年份取值为 70 到 99 时,转化为 1970 到 1999
(3)使用 CURRENT_DATE() 或 NOW() 函数,会插入当前系统的日期
TIME
1、表示时间,不包含日期部分
2、不只表示一天之内的时间,而且可以用来表示一个时间间隔,这个时间间隔可以超过 24 小时
3、占用 3 个字节
4、格式:HH:MM:SS
(1)HH:小时
(2)MM:分钟
(3)SS:秒
5、在 MySQL 中,向 TIME 类型的字段插入数据时,可以使用几种不同的格式
(1)可以使用带有冒号的字符串,格式:D HH:MM:SS、HH:MM:SS、HH:MM、D HH:MM、D HH、SS,都能被正确地插入TIME类型的字段中,D 表示天,最小值为 0,最大值为 34,如果使用带有 D 格式的字符串插入 TIME 类型的字段时,D 会被转化为小时,计算格式为 D * 24 + HH,当使用带有冒号并且不带 D 的字符串表示时间时,表示当天的时间,如:12:10 表示 12:10:00,而不是 00:12:10
(2)可以使用不带有冒号的字符串或者数字,格式:HHMMSS 或 HHMMSS,如果插入一个不合法的字符串或者数字,MySQL 在存储数据时,将其自动转化为 00:00:00 进行存储,如:1210,MySQL 将最右边的两位解析成秒,表示 00:12:10,而不是12:10:00
(3)使用 CURRENT_TIME() 或 NOW() ,会插入当前系统的时间
DATETIME
1、占用 8 个字节
2、格式为 DATE、TIME 组合:YYYY-MM-DD HH:MM:SS
(1)YYYY:年份
(2)MM:月份
(3)DD:日期
(4)HH:小时
(5)MM:分钟
(6)SS:秒
3、向 DATETIME 类型的字段插入数据时,同样需要满足一定的格式条件
(1)以 YYYY-MM-DD HH:MM:SS,或 YYYYMMDDHHMMSS 字符串,插入 DATETIME 类型字段时,最小值为 1000-01-01 00:00:00,最大值为 9999-12-03 23:59:59
(2)以 YYYYMMDDHHMMSS 数字,插入 DATETIME 类型字段时,转化为 YYYY-MM-DD HH:MM:SS 格式
(3)以 YY-MM-DD HH:MM:SS 或 YYMMDDHHMMSS 字符串,插入 DATETIME 类型字段时,两位数的年份规则符合 YEAR 类型的规则,00 到 69 表示 2000 到 2069;70 到 99 表示 1970 到 1999
(4)使用函数 CURRENT_TIMESTAMP() 和 NOW(),可以向 DATETIME 类型的字段插入系统的当前日期和时间
TIMESTAMP
1、可以表示日期时间
2、占用 4 个字节
3、显示格式与 DATETIME 类型相同:YYYY-MM-DD HH:MM:SS
4、时间范围:1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC
(1)UTC 表示世界统一时间 / 世界标准时间
(2)存储数据时,需要对当前时间所在的时区进行转换;查询数据时,再将时间转换回当前的时区
(3)使用 TIMESTAMP 存储的同一个时间值,在不同的时区查询时,会显示不同的时间
(4)向 TIMESTAMP 类型的字段插入数据时,当插入数据格式满足 YY-MM-DD HH:MM:SS、YYMMDDHHMMSS 时,两位数值的年份同样符合 YEAR 类型的规则条件,但表示时间范围要小很多
(5)如果向 TIMESTAMP 类型字段,插入的时间超出 TIMESTAMP 范围,则 MySQL 抛出错误信息
5、TIMESTAMP、DATETIME 区别
(1)TIMESTAMP 存储空间较小,表示的日期时间范围较小
(2)底层存储方式不同,TIMESTAMP 底层存储的是毫秒值,距离 1970-1-1 0:0:0 0 毫秒的毫秒值
(3)两个日期比较大小或日期计算时,TIMESTAMP 更方便、更快
(4)TIMESTAMP 和时区有关,TIMESTAMP 根据用户的时区不同,显示不同的结果
(5)DATETIME 只能反映出插入时当地的时区,其他时区的人查看数据必然有误差
6、开发经验
(1)最多使用 DATETIME 类型,包括完整的日期和时间信息,取值范围也最大
(2)一般存注册时间、商品发布时间等,使用 TIMESTAMP ,便于计算
在所有数据库中,标准是单引号,字符串统一使用 '' 括起
1、MySQL 的字符串可以使用 ""
2、Oracle 的字符串不可使用 ""
3、MySQL 中,字符串的两个连续 '' 或 "",则只把一个 ' 或 " 作为字符串;或使用 \ 转义字符,把 ' 或 " 转换为普通字符
CHAR、VARCHAR 类型
字符串(文本)类型 | 特点 | 长度 | 长度范围(byte) | 占用字节 |
CHAR(M) | 固定长度 | M | 0 <= M <= 255 | M |
VARCHAR(M) | 可变长度 | M | 0 <= M <= 65535 | 实际长度 + 1~3 |
1、CHAR(M)
(1)需要预先定义字符串长度
(2)如果不指定 (M),则表示长度默认是 1 个字符
(3)如果保存时,数据实际长度比 CHAR 类型声明的长度小,则会在右侧填充空格以达到指定的长度
(4)当 MySQL 检索 CHAR 类型的数据时,CHAR 类型的字段会去除尾部的空格
(5)定义 CHAR 类型字段时,声明的字段长度,为 CHAR 类型字段所占存储空间的字节数
(6)对于 CHAR(M) 类型的列来说,当列采用的是定长编码的字符集时,该列占用的字节数不会被加到变长字段长度列表;而如果采用变长编码的字符集时,该列占用的字节数就会被加到变长字段长度列表
(7)COMPACT 行格式下,采用变长编码字符集的 CHAR(M) 类型的列要求至少占 M 个字节,这主要是希望在将来更新该列时, 在新值的字节长度大于旧值字节长度但不大于 M 个字节,可以在该记录处直接更新,而不是在存储空间中再重新分配一个新的记录空间,导致原有的记录空间成为碎片
2、VARCHAR(M)
(1)定义时, 必须指定长度 M,否则报错
(2)MySQL 4.0 版本以下,M 表示字节
(3)MySQL 5.0 版本以上,M 表示字符
(4)检索 VARCHAR 类型的字段数据时,保留数据尾部的空格
(5)占用空间:0 ~ 65535 bytes:插入字符个数、编码决定实际占用空间,反之,根据编码不同,存放字符最大上限不同
(6)实际可用空间:65535 bytes 包括所有字段的长度,变长字段的长度标识(每个变长字段额外使用 1 或 2 个字节记录实际数据长度)、NULL 标识位的累计
(7)NULL 标识位:如果 VARCHAR 字段定义中带有 DEFAULT NULL,则需要需要 1 bit 来标识,每 8 bits 标识组成一个字段。一张表中存在 N 个 VARCHAR 字段,那么需要(N+7)/8 (取整)bytes 存储所有 NULL 标识位
(8)假设:某个字符集中最多需要 W 字节来表示一个字符、指定存储最多 M 个字符(注意是字符不是字节)、实际存储的字符串占用 L 字节,则 M * W 为字符串最多占用的字节数
(9)若 M * W <= 255,那么使用 1 字节来表示真实数据占用的字节数
(10)InnoDB 在读取记录的变长字段长度列表时先查看表结构,如果某个变长字段允许存储的最大字节数 <= 255,可以认为只使用 1 字节来表示真实数据占用的字节数
(11)如果 M * W > 255,且 L <= 127,则用 1 字节来表示真实数据占用的字节数
(12)如果 M * W > 255,且 L > 127,则用 2 字节来表示真实数据占用的字节数
(13)InnoDB 在读取记录的变长字段长度列表时先查看表结构,如果某个变长字段允许存储的最大字节数 > 255,如何区分它正在读的某个字节是一个单独的字段长度还是半个字段长度?使用该字节的第一个二进制位作为标志位:如果该字节的第一个位为 0,该字节就是一个单独的字段长度;如果该字节的第一个位为 1,该字节就是半个字段长度
3、对比
类型 | 特点 | 空间上 | 时间上 | 应用场景 |
CHAR(M) | 固定长度 | 浪费存储空间 | 效率高 | 存储不大,速度要求高 |
VARCHAR(M) | 可变长度 | 节省存储空间 | 效率低 | 非 CHAR 情况 |
(1)存储很短的信息,使用 CHAR
(2)固定长度,如:使用 uuid 作为主键,使用 CHAR
(3)十分频繁改变 column,使用 CHAR
(4)MyISAM:使用 CHAR 代替 VARCHAR,使得整个表静态化,从而使数据检索更快,空间换时间
(5)MEMORY:无论使用 CHAR 或 VARCHAR,两者都作为 CHAR 处理
(6)InnoDB:建议使用 VARCHAR,对于 InnoDB,内部行存储格式并没有区分 CHAR、VARCHAR,所有数据行都使用指向数据列值的头指针,且主要影响性能因素是数据行使用的存储总量,由于 CHAR 平均占用空间多于 VARCHAR,除简短且固定长度,
否则选择 VARCHAR,节省空间,对磁盘 I/O 和数据存储总量较好
TEXT
1、系统自动按照实际长度存储,不需要预先定义长度
文本字符串类型 | 特点 | 长度 | 长度范围(字符) | 占用字节 |
TINYTEXT | 小文本、可变长度 | L | 0 <= L <= 255 | L + 1 |
TEXT | 文本、可变长度 | L | 0 <= L <= 65535 | L + 2 |
MEDIUMTEXT | 中等文本、可变长度 | L | 0 <= L <= 16777215 | L + 3 |
LONGTEXT | 大文本、可变长度 | L | 0 <= L <= 4294967295 | L + 4 |
2、由于实际存储的长度不确定,MySQL 不允许 TEXT 类型的字段做主键
3、在保存和查询数据时,不删除 TEXT 数据尾部的空格
4、开发
(1)TEXT 文本类型,可以存比较大的文本段,搜索速度稍慢
(2)TEXT、BOLO 类型数据删除后容易导致空洞,使得文件碎片比较多,频繁使用的表,不建议包含 TEXT 类型字段,建议单独使用一个表
ENUM / 枚举
1、取值范围需要在定义字段时进行指定
2、所需要的存储空间由定义ENUM类型时指定的成员个数决定
文本字符串类型 | 长度 | 长度范围(L 表示实际成员个数) | 占用字节 |
ENUM | L | 1 <= L <= 65535 | 1 或 2 |
(1)当 ENUM 包含 1~255 个成员时,需要 1 个字节的存储空间
(2)当 ENUM 包含 256~65535 个成员时,需要 2 个字节的存储空间
3、插入数据
(1)忽略大小写
(2)允许按照角标的方式,获取指定索引位置的枚举值
(3)当 ENUM 字段没有声明为 NOT NULL 时,插入 NULL 有效
(4)设置字段值时,只允许从成员中选取单个值,不能一次选取多个值
SET
1、表示一个字符串对象
2、可以包含 0 个或多个成员,成员个数的上限为 64
3、当 SET 包含成员个数不同时,占用的存储空间不同
成员个数范围(L 表示实际成员个数) | 占用字节 |
1 <= L <= 8 | 1 |
9 <= L <= 16 | 2 |
17 <= L <= 24 | 3 |
25 <= L <= 32 | 4 |
33 <= L <= 64 | 8 |
4、插入数据
(1)插入重复 SET 成员时,MySQL 自动删除重复成员
(2)设置字段值时,可以取范围内的 0 个或多个值
(3)向 SET 字段插入 SET 成员中不存在的值时,MySQL 抛出错误
BINARY、VARBINARY
1、BINARY、VARBINARY 类似 CHAR、VARCHAR,只是它们存储二进制字符串
二进制字符串类型 | 特点 | 值的长度 | 占用字节 |
BINARY(M) | 固定长度 | 0 <= M <= 255 | M |
VARBINARY(M) | 可变长度 | 0 <= M <= 65535 | M+1 |
2、BINARY(M)
(1)固定长度的二进制字符串
(2)M:表示最多能存储的字节数,取值范围:0~255 个字符
(3)如果未指定 (M),表示只能存储 1 个字节,如果字段值不足 (M) 个字节,将在右边填充 \0 以补齐指定长度
3、VARBINARY(M)
(1)可变长度的二进制字符串
(2)M:表示最多能存储的字节数,总字节数不能超过行的字节长度限制 65535,另外还要考虑额外字节开销,VARBINARY 除了存储数据本身外,还需要 1 或 2 个字节来存储数据的字节数
(3)VARBINARY 必须指定(M) ,否则报错
BLOB
1、二进制大对象 ,可以容纳可变数量的数据
2、开发中,不会在 MySQL 数据库中使用 BLOB 存储大对象数据,通常会将图片、音频、视频存储到服务器磁盘上 ,并将图片、音频、视频的访问路径存储到 MySQL 中
二进制字符串类型 | 值的长度 | 长度范围(byte) | 占用字节 |
TINYBLOB | L | 0 <= L <= 255 | L + 1 |
BLOB | L | 0 <= L <= 65535(相当于 64 KB) | L + 2 |
MEDIUMBLOB | L | 0 <= L <= 16777215(相当于 16 MB) | L + 3 |
LONGBLOB | L | 0 <= L <= 4294967295(相当于 4 GB) | L + 4 |
3、TEXT、BLOB 事项
(1)执行大量的删除或更新操作时,会在数据表中留下很大的空洞,以后填入这些空洞的记录可能长度不同,为了提高性能,建议定期使用 OPTIMIZE TABLE 功能对这类表进行碎片整理
(2)如果需要对大文本字段进行模糊查询,MySQL 提供前缀索引,在不必要时,避免检索大型 BLOB 或 TEXT 值
(3)BLOB 或 TEXT 分离到单独表中,在某些环境中,如果把这些数据列移动到第二张数据表中,把原数据表中的数据列转换为固定长度的数据行格式,,这会减少主表中的碎片,得到固定长度数据行的性能优势,在主数据表上运行 SELECT * 查询时候不会通过网络传输大量 BLOB 或 TEXT 值
JSON
1、JavaScript Object Notation
2、一种轻量级的数据交换格式,简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言,易于人阅读和编写,同时易于机器解析和生成,并有效地提升网络传输效率
3、JSON 可以将 JavaScript 对象中一组数据转换为字符串,在网络或者程序之间轻松地传递这个字符串,并在需要时将它还原为各编程语言所支持的数据格式
4、在 MySQL 5.7 中,已经支持 JSON 数据类型
5、在 MySQL 8.x 版本中,JSON 类型提供可以进行自动验证的 JSON 文档和优化的存储结构,使得在 MySQL 中存储和读取 JSON 类型数据更加方便和高效
6、当需要检索 JSON 字段中数据的某个具体值时,可以使用 -> 和 ->> 符号
空间类型
1、MySQL 支持地理特征的生成、存储、分析
2、MySQL 中使用 Geometry(几何) 来表示所有地理特征,Geometry 指一个点或点的集合,代表世界上任何具有位置的事物
3、MySQL 空间数据类型(Spatial Data Type)对应 OpenGIS 类
(1)单值类型:GEOMETRY、POINT、LINESTRING、POLYGON
(2)集合类型:MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION
4、Geometry:所有空间集合类型的基类,其他类型如 POINT、LINESTRING、POLYGON 都是 Geometry 子类
5、Point:点,坐标值支持 DECIMAL 类型,经度(longitude)在前,维度(latitude)在后,用空格分隔
6、LineString:线,由一系列点连接而成,如果线从头至尾没有交叉,则为简单(simple);如果起点和终点重叠,则为封闭(closed),点与点之间用逗号分隔,一个点中的经纬度用空格分隔,与 POINT 格式一致
7、Polygon:多边形,可以是一个实心平面形,即没有内部边界,也可以有空洞,类似纽扣
类型选择
1、在定义数据类型时
(1)整数:选择 INT
(2)小数:选择定点数类型 DECIMAL(M, D)
(3)日期与时间:选择 DATETIME
2、字符串选择
(1)任何字段如果为非负数,必须是 UNSIGNED
(2)小数类型为 DECIMAL,禁止使用 FLOAT 和 DOUBLE
(3)如果存储的字符串长度几乎相等,使用 CHAR 定长字符串类型
(4)VARCHAR 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此值,定义字段类型为 TEXT,独立出来一张表,用主键来对应,避免影响其它字段索引效率
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战