【Mysql系列】 Mysql数据类型

1.1. CHAR与VARCHAR类型

CHAR()类型表示长度固定的字符串,n表示字符的最大数量,取值范围从0到255。如果输入的字符串长度不够,将会使用空格进行填充。默认情况下没有设置SQL模式PAD CHAR TO FULL LENGTH,MySQL读取 CHAR字段时自动截断了尾部的空格

VARCHAR字段的实际最大长度受限于最大的行大小(65536字节,所有字段长度之和)以及字符集。例如, utf8b4字符集中的一个字符最多占用4个字节,因此这种字符集的VARCHAR字段可以声明的最大长度为 16383。

1.2. BINARY.与VARBINARY

BINARY(M)和/ARBINARY(M)类型与CHAR和ARCHAR类型类似,但是存储的内容为二进制字节串,而不是普通字符串。其中M表示最大的字节长度,分别为255和65535。这两种类型使用binary字符集和排序规则,基于字节数值进行比较和排序。 I存储BINARY数据时,在尾部使用0x00(字节0)填充到指定长度,查询时不会删除尾部的O字节。所有的字节对应比较操作都有意义,包括ORDER BY和DI1 STINCT:操作,OxO0和空格比较的结果不相等,OxOO的排序在空格前面。

1.3. TEXT与BLOB

TEXT类型可以用于存储长文本字符串,长度支持1字节到4GB。M小ySQL不会在服务器内存中缓存TEXT数据,而是从磁盘中读取,所有访问时比CHAR和VARCHAR类型更慢一些。MySQL插入或者查询时不会对TEXT数据尾部空格进行任何处理。 MySQL提供了4种形式的TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT以及LONGTEXT。● TINYTEXT,最大长度为255个字节,类似于VARCHAR(255)。每个TINYTEXT值需要1字节额外的存储表示长度 TEXT(SAMLLTEXT),最大长度为64KB,类似于VARCHAR(65535)。每个TEXT值需要2字节额外的存储表示长度; MEDIUMTEXT,最大长度为16MB。每个MEDIUMTEXT值需要3字节额外的存储表示长度;●·LONGTEXT,最大长度为4GB。每个LONGTEXT值需要4字节额外的存储表示长度。?TEXT数据类型一般用于存储文章内容、产品文档等信息。只有在普通字符串类型的长度无法满足时才会考虑使用TEXT类型,推荐单独使用一个表存储这种字段。 BLOB类型可以用于存储二进制大对象,长度支持1字节到4GB;BLOB类型使用binarya字符集和排序规则,基于字节数值进行比较和排序。MySQL不会在服务器内存中缓存BLOB数据,而是从磁盘中读取,所有访问时比 BINARY和/ARBINARY:类型更慢一些。MySQL插入或者查询时不会对BLOB数据尾部空格进行任何处理。 MySQL提供了4种形式的BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB以及LONGBLOB。

MySQL使用独立的"外部存储"处理TEXT和BLOB数据,而且只对数据的max_sort_.lerigth:字节进行排序,不支持完整数据的索引和排序。△BLOB数据类型一般用于存储图片、文档、视频等信息,但是不建议这样使用。推荐使用单独的对象存储二进制内容,并且在数据库中保存文件路径。

1.4. ENUM类型

ENUM('value1',value2',…)类型定义了一个枚举,即取值限定为value1'、value.2'、、NULL或者"之一的字符串对象。ENUM数据在内部使用整数表示,最多包含65535个不同的值。每个枚举元素最大的长度为M<=255并且(M*W)<=1020,其中M是元素的字面长度,W是字符集中字符可能占用的最大字节数。使用枚举类型的优势在于:·在字段的取值有限时提供紧凑的数据存储,枚举在内部使用整数表示,需要1字节或2字节存储:查询结果的可读性,内部整数在查询结果中显示为相应的字符串。

如果插入100万条'medium数据,需要100万字节存储;如果直接使用/ARCHAR:类型,需要6倍存储。使用枚举类型时需要注意枚举值的排序使用内部的索引数字,而不是字符串。例如,对于ENUM(b',)字符b排在ā之前。枚举类型和字符串类型的连接查询性能更慢。

1.5. SET类型

SET(value1',value.2',.…)类型定仪了一个集合,即取值限定为value1'、value.2'、.中零个或多个的字符串对象。SET数据在内部使用整数表示,最多包含64个不同的成员。每个集合元素最大的长度为M<=255并且(M*W)<=1020,其中M是元素的字面长度,w是字符集中字符可能占用的最大字节数。

SET对象的存储空间由集合成员的个数决定;如果个数为N,对象占用(N+7)/8字节,向上取整为1、2、3、4或者8字节。I MySQL提供了FIND_IN_SET、FIELD等函数,方便了SET数据类型的使用。?SET类型的一个典型应用时访问控制列表(ACL)

1.6. 日期和时间

MySQL提供了以下存储日期时间值的数据类型:DATE、TIME、DATETIME、TIMESTAMP以及YEAR。其中, TIME、DATETIME、TIMESTAMP:支持小数秒,最多6位小数(微秒)。

1.6.1. 日期类型

DATE表示日期类型,支持的范围从'1000-01-01'到'9999-12-31',占用3个字节。DATE数据的显示格式为 YY-MM-DD'。例如:

MySQL使用4位数字存储日期数据中的年份,如果输入2位年份,将会使用以下规则:·00~69之间的年份转换为2000~2069:·70~99之间的年份转换为1970~1999。

1.6.2. 时间类型

MySQL使用TIME类型表示一天中的时间,格式为'HH:MM:SS',范围小于24小时。另外,也可以使用TIME表示两个事件之间的时间间隔,格式为hhh:mm:ss',范围从'-838:59:59'到'838:59:59'。TME类型需要3字节存储空间。 MySQL使用TIME(N)表示包含小数部分的时间,最多包含6位小数(微秒),默认为0位。如果包含了小数秒 TIME需要额外的存储,TIME(1)和TIME(2)需要4字节,TIME(3)和TIME(4)需要5字节,TIME(5)和TIME(6)需要6字节存储。

1.6.3. 时间戳类型

DATETIME(N)和TIMESTAMP(N)类型可以同时存储日期(DATE)和时间(TIME)信息,也就是时间戳。 DATETIME类型使用YYY-MM-DDhh:mm:ss[.fraction]'格式显示,支持范围'1000-01-0100:00:00.000000'到9999-12-3123:59:59.999999',默认0位小数秒,需要5字节存储。如果支持小数秒,额外的存储和 TIME(N)类似。1 TIMESTAMP类型使用UTC时区进行存储,支特范围'1970-01-0100:00:01.000000'UTC到2038-01-19 03:14:07.999999'UTC,默认0位小数秒,需要4字节存储。如果支特小数秒,额外的存储和T1ME(N)类似。

结果显示,TIMESTAMP类型会随着当前时区进行调整。 DATETIME和TIMESTAMP类型支持自动初始化或者更新为当前日期时间,在字段定义时分别使用DEFAU儿T CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性进行设置。

另一种存储时间戳的方式是使用UNX时间戳,即当前时间距离1970年1月1日的秒数来表示时间。例如,使用 INT可以支持到2038年,无符号的NT可以支持到2106年。这种存储方式的缺点就是可读性不强。MySQL提供了FORM_UNIXTIME和UNIX_TIMESATMP函数处理整数和时间戳的转换,也可以依赖应用程序进行格式处理。

1.7. Json数据类型

MySQL5.7.8开始支持原生JSON数据类型,可以支持更加高效的SON文档存储和管理。原生SON数据类型提供了自动的格式验证以及优化的存储格式,可以快速访问文档中的元素节点。例如:

JSON文档的最大长度不能超过系统变量max_allowed_packet(默认64MB)的限制。除了)SON数据类型之外,MySQL还提供了许多SON处理函数和操作符,例如:构造SON对象的SON_OBJECT、JSON_ARRAY;·查询指定元素的->(JSON_EXTRACT)、>>(SON_UNQUOTE+JSON_EXTRACT)·将)SON数据转换为SQL数据的SON_TABLE;·更新SON数据的SON SET、JSON_INSERT、JSON_REPLACE、JSON_REMOVE格式验证的SON_VALID函数。一般来说,JSON字段所需的存储和LONGBLOB或者LONGTEXT差不多。不过,JSON文档的二进制编码需要额外的存储,包括元数据和字典信息。举例来说,JS0N文档中的字符串需要额外的4到10个字节存储。

一般来说,JSON字段所需的存储和LONGBLOB或者LONGTEXT:差不多。不过,SON文档的二进制编码更额外的存储,包括元数据和字典信息。举例来说,S0N文档中的字符串需要额外的4到10个字节存储。 JSON数据类型的优势是结构更灵活,不需要预定义字段。M小ySQL支持基于虚拟列的索引,可以为SON节点创建索引,优化查询性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值