根据MySQL官方文档,MySQL5.7版本和MySQL8.0版本的数据类型主要分为5种[1,2]。前三种数据类型较为常用。2.日期与时间型 Date and Time Types4.空间数据类型Spatial Data Types5.JSON数据类型 The JSON Data Types本文介绍的是字符串型String Types,可以分为以下几类:char和varchar类型相似,但存储和检索方式不同。它们在最大长度和是否保留尾随空格方面也有所不同。CHAR列的长度固定为创建表时声明的长度。长度可以是从0到255(2^8-1)的任何值。存储char值时,会用指定长度的空格对其进行右填充。检索char值时,尾部空格默认将被删除,除非启用pad_char_to_full_length sql模式。VARCHAR列中的值是可变长度字符串。VARCHAR值存储为1字节或2字节长度的前缀加上数据,长度可以指定为0到65535(2^16-1)之间的值。varchar的有效最大长度取决于最大行大小(65535字节)和所使用的字符集。表1 MySQL的CHAR(4)和VARCHAR(4)对比(假设该列使用单字节字符集,如latin1)
CHAR是定长字符串,存储的时候会用空格进行填充,相应的在检索的时候会自动去掉空格。VARCHAR存储的时候不会填充。- VARCHAR值存储的时候是 前缀+数据,前缀为1字节或2字节,如果值不超过255个字节,那么前缀的长度是1字节,如果长度超过255个字节,那么前缀的长度就是2个字节。在表2的第四行中,用VARCHAR(4)对’abcd’进行存储,因为值不超过255字节,所以前缀的长度为1字节,又因为数据’abcd’的长度为4字节,所以总的存储长度为4字节+1字节=5 字节。
- 存储在表最后一行的值仅在未选择mysql严格模式(strict mode)时适用;如果mysql以严格模式运行,则不会存储超过列长度的值,并会导致错误。
排序:char和varchar列中的值,根据分配给该列的字符集排序规则进行排序和比较。存储数值超出长度的处理方式:如果未启用严格的SQL模式,并且用户为CHAR或VARCHAR列分配的值超过了该列的最大长度,则该值将被截断以符合该列的长度,并会生成警告。BINARY和VARBINARY类型包含二进制字符串而不是非二进制字符串。也就是说,它们包含字节字符串而不是字符串。BINARY和VARBINARY允许的最大长度与char和varchar相同,只是BINARY和VARBINARY的长度是以字节(bytes)而不是字符(characters)为单位的长度。BINARY和VARBINARY类型具有二进制字符集和排序规则,并且比较和排序基于值中字节的数值。BLOB是一个二进制大对象,可以容纳可变长度的数据。四种BLOB类型是TINYBLOB, BLOB, MEDIUMBLOB和LONGBLOB.。这些不同之处仅在于它们可以保存的最大值长度。TEXT文本值被视为非二进制字符串(字符串)。它们有一个不同于二进制的字符集,并且根据字符集的排序规则对值进行排序和比较。ENUM枚举类型:ENUM是一个字符串对象,其值选自表创建时列规范中显式枚举的允许值列表。【例】创建shirts表,其中size字段为ENUM类型,可取值'x-small', 'small', 'medium', 'large', 'x-large'。 size ENUM('x-small', 'small', 'medium', 'large', 'x-large')INSERT INTO shirts (name, size) VALUES ('t-shirt','medium');SELECT name, size FROM shirts WHERE size = 'medium';注:枚举值不能是表达式,即使是计算结果为字符串值的表达式。MySQL建议用户不要使用数字作为枚举值,因为它不会在适当的TINYINT或SMALLINT类型上节省存储空间。SET集合是可以有零个或多个值的字符串对象,每个值都必须从创建表时指定的允许值列表中选择。【例】SET('one', 'two') NOT NULL 的取值可以为:一个集合列最多可以有64个不同的成员。如果启用了严格SQL模式,定义中的重复值会导致警告或错误。创建表时,尾随空格会自动从表定义中的集合成员值中删除。对于包含多个set元素的值,插入该值时元素以什么顺序列出并不重要。给定元素在值中列出多少次也无关紧要。稍后检索该值时,该值中的每个元素都会出现一次,元素会根据创建表时指定的顺序列出。假设col列被指定为SET('a','b','c','d')。mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
如果向col列插入记录 'a,d', 'd,a', 'a,d,d', 'a,d,a', and 'd,a,d':mysql> INSERT INTO myset (col) VALUES
-> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
mysql> SELECT col FROM myset;[1] DataTypes.MySQL 8.0 Reference Manual. https://dev.mysql.com/doc/refman/8.0/en/char.html[2] DataTypes.MySQL 5.7 Reference Manual. https://dev.mysql.com/doc/refman/5.7/en/char.html