要点概论
1. 引言
2. 整数类型
3. 浮点类型
4. 字符串类型
5. 时间日期
6. 集合类型
1. 引言
数据类型在数据库中扮演着基础但又十分重要的角色,因此对数据类型的选择将影响与数据库交互的应用程序的性能。
通常来说,如果在一个页面中可以存放尽可能多的行,那么数据库的性能就越好,因此选择一个正确的数据类型至关重要。
2. 整数类型
mysql 中的整数类型主要有5个,分别时 TINYINT ,SMALLINT , MEDIUMINT , INT 和BIGINT。
它们在很大程度上时相同的,只有存储之的大小时不相同的,如下表所示:
类型 | 大小 | 范围(有符号) | 范围(无符号) | 用途 |
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,4 294 967 295) | 大整数值 |
INT 或 INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8字节 |
(-9 233 372 036 854 775 808, 9 223 372 036 854 775 807) |
(0,18 446 744 073 709 551 615) |
极大整数值 |
如果整数类型的列要存储的数据超出范围之外, MySQL 会根据允许范围最接近它的一端截短后在进行存储。
另外, MySQL 会在不合规定的值插入表前,将其自动修改为 0。
数据类型的列有如下两种属性。
1) UNSIGNED 属性
UNSIGNED 属性就是将数字类型无符号化,与 C ,C++等程序语言中 unsigned 关键字的作用相同。
例如, INT 类型有符号的范围是 -2 147 483 648 ~ 2 147 483 647,INT UNSIGNED(无符号)的范围是 0 ~ 4 294 967 295。
2)ZEROFILL 属性
ZEROFILL 属性的作用是如果整数类型列的值小于设置的宽度,则在前面自动填充 0 。
例如, INT(4) 类型的列在插入 1 之后的显示为 “0001” 。
3. 浮点类型(待补充)
4. 字符串类型
字符串类型是最常用的数据类型, MySQL 提供了 10 个基本的字符串类型,可以存储的字符串范围从简单的一个字符到巨大的文本块或二进制字符串数据。
说明如下表所示:
类型 | 大小 | 用途 |
CHAR | 0 ~ 255 字节 | 固定长度字符串 |
VARCHAR | 0 ~ 255 字节 | 可变长度字符串 |
TINYBLOB | 0 ~ 255 字节 | 不超过 255 个字符的二进制字符串 |
TINYTEXT | 0 ~ 255 字节 | 短文本字符串 |
BLOB | 0 ~ 65 535 字节 | 二进制形式的长文本字符串 |
TEXT | 0 ~ 65 535 字节 | 长文本数据 |
MEDIUMBLOB | 0 ~ 16 777 215 字节 | 二进制形式的中等长度文本数据 |
MEDIUMTEXT | 0 ~ 16 777 215 字节 | 中等长度文本数据 |
LOGNGBLOB | 0 ~ 4 294 967 295 字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0 ~ 4 294 967 295 字节 | 极大文本数据 |
关于各个类型的使用方法和注意事项如下:
4.1 CHAR 和 VARCHAR 类型
CHAR 类型用于固定字符串,并且必须在圆括号内用一个修饰符来定义其大小。
这个修饰符的范围从 0 到 255 。
比指定长度大的值将被截断,而比指定长度小的值将会用空格作填补。
CHAR 类型可以使用 BINARY 修饰符,当用于比较运算时,这个修饰符使 CHAR 以二进制方式参与运算,而不是以传统的区分大小写的方式。
CHAR 类型的一个变体是 VARCHAR 类型,它是一种可变长度的字符串类型,并且也必须带有一个范围在 0 ~ 255 之间的修饰符。
CHAR 和 VARCHAR 的不同之处在于 MySQL 数据库处理这个修饰符的方式,如下所示:
1)CHAR 把这个大小视为值得大小,长度不足得情况下就用空格补足。
2)VARCHAR 类型把它视为最大值并且只使用存储字符串实际需要的长度(增加一个额外字节来存储字符串本身得长度)来存储值。
所以 VARCHAR 类型中,短于修饰符长度的 VARCHAR 类型不会被空格填补,但长于修饰符的值仍然会被截断。
因为 VARCHAR 类型可以根据时机内容动态改变存储值的长度,所以在不能确定字段需要多少字符时,使用 VARCHAR 类型可以大大地节约磁盘空间,提高存储效率。
相对的,VARCHAR 类型的数据的查询效率要低于 CHAR 类型数据。
4.2 TEXT 和 BLOB 类型
对于字段长度要求超过 255 个的情况下, MySQL 提供了 TEXT 和 BLOB 两种类型。
根据存储数据的大小,它们都具有不同的子类型。
这些大型的数据用于存储文本块或图像,声音文件等二进制数据类型。
TEXT 和 BLOB 类型在分类和比较上存在区别。
BLOB 类型区分大小写,而 TEXT 不区分大小写。
大小写修饰符不用于各种 BLOB 和 TEXT 子类型。
比制定类型支持的最大范围大的值将被自动截断。
5. 时间日期(待补充)
6. 集合类型
MySQL 支持两种集合类数据类型 ENUM 和 SET 。
一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。
6.1 ENUM 类型 (例子待补充)
ENUM 类型只允许在集合中取得一个值,其作用类似于单选项,常用于处理相互排斥的数据,例如人的性别。
ENUM 类型字段可以从集合中取得一个值或使用 NULL 的值,除此之外的输入将会使 MySQL 在这个字段中插入一个空字符串。
另外,如果插入值的大小写与集合中值的大小写不匹配, MySQL 会自动使用插入值的大小写转换成与集合中大小邪恶一致的值。
ENUM类型在系统内部可以存储为数字,并且从 1 开始用数字作索引。
一个 ENUM 类型最多可以包含 65 536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,这个错误值用索引 0 或者一个空字符串来表示。
例子如下(待补充):
6.2 SET 类型
SET 类型与 ENUM 类型相似但不相同。
SET 类型可以从预定义的集合中取得任意数量的值,其作用类似于复选框。
与 ENUM 类型相同的时,任何试图 在 SET 类型字段中插入非预定义的值都会使 MySQL 插入一个空字符串。
如果插入一个既有合法的元素又有非法的元素的记录, MySQL 将会保留合法的元素,忽略非法的元素。
一个 SET 类型最多可以包含 64 项元素。
在 SET 元素中值被存储为一个分离的 “位” 序列,这些 “位” 表示与它相对应的元素。
“位” 是创建有序元素集合的一种简单而有效的方式。并且它还去除了重复的元素,所以 SET 类型中不可能包含两个相同的元素。
例子如下:
1)创建一个仅包含一列的 myset 数据表,该列指定位 SET(‘a‘,‘b‘,‘c‘,‘d‘) :
CREATE TABLE myset( col SET(‘a‘,‘b‘,‘c‘,‘d‘) );
2)分别使用不同的组合形式向 myset 表中插入数据:
INSERT INTO myset (col) VALUES (‘a,d‘),(‘d,a‘),(‘a,b,a‘),(‘a,c,d‘),(‘d,a,d‘);
3)上述语句执行完之后, myset 表中将增加 5条数据,通过查询获取以下内容:
SELECT col FROM myset; 查询结果如下: +----------+ | col | +----------+ | a,d | | a,d | | a,b | | a,c,d | | a,d | +----------+
4)再次插入一行数据,这次为 SET 列设置一个不支持的值:
INSERT INTO myset (col) VALUES (‘a,d,d,s‘) # [Err] 1265 - Data truncated for column ‘col‘ at row 1
此时执行后将会提示警告信息,说明插入失败。