MySQL数据类型
大约 4 分钟约 1264 字
本节介绍MySQL中的数据类型。
数字类型
MySQL支持所有的ANSI/ISO 92 数字类型,包括准确数字的数字类型以及近似数字的数字类型。
数据类型主要可以分为整型和浮点型两种数据类型,如下:
- 整型
数据类型 | 取值范围 | 说明 | 单位 |
---|---|---|---|
TINYINT | 符号值:-128~127,无符号值:0~255 | 最小的整数 | 1字节 |
BIT | 符号值:-128~127,无符号值:0~255 | 最小的整数 | 1字节 |
BOOL | 符号值:-128~127,无符号值:0~255 | 最小的整数 | 1字节 |
SMALLINT | 符号值:-32768~32767,无符号值:0~65535 | 小型整数 | 2字节 |
MEDIUMINT | 符号值:-8388608~8388607,无符号值:0~16777215 | 中型整数 | 3字节 |
INT | 符号值:-2147683648~2147683647,无符号值:0~4294967295 | 标准整数 | 4字节 |
BIGINT | 符号值:-9223372036854775808~9223372036854775807, 无符号值:0~18446744073709551615 | 大型整数 | 8字节 |
- 浮点型
数据类型 | 取值范围 | 说明 | 单位 |
---|---|---|---|
FLOAT | +(-)3.402823466E+38 | 单精度浮点数 | 8或4字节 |
DOUBLE | +(-)1.7976931348623157E+308、 +(-)2.2250738585072014E-308 | 双精度浮点数 | 8字节 |
DECIMAL | 可变 | 一般整数 | 自定义长度 |
其中DECIMAL是精度确定的小数,比如想要指定总位数为8、小数位数为2的数就可以使用DECICAL(8,2),其中8就表示总共有8位数,2表示其中有2位小数。
FLOAT和DOUBLE存在误差问题,尽量避免浮点数比较,若要使用货币等高精度的数字则应该使用DECIMAL数据类型。
字符串类型
字符串类型可以分为3类:普通的文本类型(CHAR和VARCHAR)、可变类型(BLOB和TEXT)、和特殊类型(SET和ENUM)。
- 普通文本类型:即CHAR和VARCHAR类型,CHAR列的长度被固定为创建表声明的长度,取值在1-255;VARCHAR列的值是变长的字符串,取值和CHAR一样。
类型 | 取值范围 | 说明 |
---|---|---|
[national] CHAR(M) [binary|ASCII|unicode] | 0-255个字符 | 固定长度为M的字符串,其中M的取值为0-255,national关键字指 定了应该使用的默认字符集。binary关键字指定了数据是否区分大小 写(默认是区分大小写的)。ASCII关键字指定了在该列中使用latin1字符集。unicode关键字指定了是否使用UCS字符集。 |
CHAR | 0-255个字符 | 与CHAR(M)类似 |
[national] VARCHAR(M) [binary] | 0-255个字符 | 长度可变,其他和CHAR(M)类似 |
存储字符串长度相同的全部使用CHAR类型;字符长度不相同的使用VARCHAR类型,不预先分配存储空间,长度不要超过255。
- 可变类型:大小可以改变,TEXT类型适合存储长文本,BLOB适合存储二进制数据,支持任何数据,如声音、文本和图像等。
类型 | 最大长度(字节数) | 说明 |
---|---|---|
TINYBLOB | 28-1(255) | 小BLOB字段 |
TINYTEXT | 28-1(255) | 小TEXT字段 |
BLOB | 216-1(255) | 常规BLOB字段 |
TEXT | 216-1(255) | 常规TEXT字段 |
MEDIUMBLOB | 224-1(255) | 中型BLOB字段 |
MEDIUMTEXT | 224-1(255) | 中型TEXT字段 |
LONGBLOB | 232-1(255) | 长BLOB字段 |
LONGTEXT | 232-1(255) | 长TEXT字段 |
- 特殊类型:ENUM和SET类型。
类型 | 最大值 | 说明 |
---|---|---|
ENUM(“value1”,”value2”,...) | 65535 | 该类型的列只可以容纳值之一或者NULL |
SET(“value1”,”value2”,...) | 64 | 该类型的列可以容纳一组值或为NULL |
误区警示:BLOB、TEXT、ENUM和SET字段类型在MySQL中的检索速度不高,很难使用索引进行优化。如果必须使用这些类型,一般采用特殊的结构设计,或者与程序相结合使用其他的字段类型替代。例如,SET类型可以使用整型(0、1、2、3、…)注释功能和程序的检查功能集合替代。
若速度优先、要选择固定的列,则选择CHAR类型;若节省空间、使用动态的列,则使用VARCHAR类型;要将列的内容限制在一种选择则选择ENUM类型;允许一个列有多于一个的条目则选择SET,若字符串不区分大小写则选择TEXT类型,若区分大小写则选择BLOB类型。
日期和时间类型
日期和时间类型包括DATE、DATETIME、TIME、TIMESTAMP和YEAR。其中的每种类型都有其取值范围,如赋予它一个不合法的值,将会被“0”替代。
类型 | 取值范围 | 说明 |
---|---|---|
DATE | 1000-01-01~9999-12-30 | 日期,格式为YYYY-MM-DD |
TIME | -898:58:59~835:59:59 | 时间,格式为HH:MM:SS |
DATETIME | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 日期和时间,格式为YYYY-MM-DD HH:MM:SS |
TIMESTAMP | 1970-01-01 00:00:00~2037年的某个时间 | 时间标签,在处理报告时使用,显示格式取决于M的值 |
YEAR | 1901~2155 | 年份可指定两位数字和四位数字的格式 |
在MySQL中,日期的顺序是严格按照标准的ANSI SQL格式输出的。