一、MySQL的数据类型
主要包括以下五大类:
整数类型:
BIT
、BOOL
、TINY INT
、SMALL INT
、MEDIUM INT
、INT
、BIG INT
浮点数类型:
FLOAT
、DOUBLE
、DECIMAL
字符串类型:
CHAR
、VARCHAR
、TINY TEXT
、TEXT
、MEDIUM TEXT
、LONGTEXT
、TINY BLOB
、BLOB
、MEDIUM BLOB
、LONG BLOB
日期类型:
Date
、DateTime
、TimeStamp
、Time
、Year
其他数据类型:
BINARY
、VARBINARY
、ENUM
、SET
、Geometry
、Point
、MultiPoint
、LineString
、MultiLineString
、Polygon
、GeometryCollection
等
1. 整数型
类型 | 字节 | 范围(有符号) | 范围(无符号) |
---|---|---|---|
TINYINT(m) | 1 | (-128,127) | (0,255) |
SMALLINT(m) | 2 | (-32768,32767) | (0,65535) |
MEDIUMINT(m) | 3 | (-8388608,8388607) | (0,16777215) |
INT(m) | 4 | (-2147483 648,2147483647) | (0,4294967295) |
BIGINT(m) | 8 | (-9223372036854775808,9223372036854775807) | (0,18446744073709551615) |
类型后面括号里的m
指的是显示宽度,显示宽度与所能存储的数据范围无关,目前已知的是当设置了ZEROFILL
(填充0
)约束条件时,填充 0
的 个数由m
决定,
例如:设置id int(5) ZEROFILL
,属性id
会填充成如下形式
+-----------+-----------+
| id | name |
+-----------+-----------+
| 00001 | Jane |
+-----------+-----------+
| 00002 | Mike |
+-----------+-----------+
2. 浮点数和定点数
类型 | 大小 | 用途 |
---|---|---|
FLOAT | 4字节 | 单精度浮点数值 |
DOUBLE | 8字节 | 双精度浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 小数值 |
设一个字段定义为float(6,3)
,如果插入一个数123.45678
,实际数据库里存的是123.457
,但总个数还以实际为准,即6位。整数部分最大是3位,如果插入数12.123456
,存储的是12.1234
,如果插入12.12
,存储的是12.1200
.
浮点型在数据库中存放的是近似值,而定点类型在数据库中存放的是精确值。
decimal(m,d) 参数m<65 是总个数,d<30且 d<m 是小数位。
为了能够引起大家的重视,请看下面的例子:
mysql> CREATE TABLE test (c1 float(10,2),c2 decimal(10,2));
Query OK, 0 rows affected (0.29 sec)
mysql> insert into test values(131072.32,131072.32);
Query OK, 1 row affected (0.07 sec)
mysql> select * from test;
+-----------+-----------+
| c1 | c2 |
+-----------+-----------+
| 131072.31 | 131072.32 |
+-----------+-----------+
1 row in set (0.00 sec)
从上面的例子中我们看到c1
列的值由131072.32
变成了131072.31
,这就是浮点数的不精确性造成的。
在mysql中float
、double
(或real
)是浮点数,decimal
(或numberic
)是定点数。
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。在今后关于浮点数和定点数的应用中,大家要记住以下几点:
- 浮点数存在误差问题;
- 对货币等对精度敏感的数据,应该用定点数表示或存储;
- 编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
- 要注意浮点数中一些特殊值的处理。
3. 日期时间
类型 | 字节 | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
若定义一个字段为timestamp,这个字段里的时间数据会随其他字段修改的时候自动刷新,所以这个数据类型的字段可以存放这条记录最后被修改的时间。
4. 字符串类型
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
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字节 | 中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
CHAR
和 VARCHAR
类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。
1.char(n)
若存入字符数小于n
,则以空格补于其后,查询之时再将空格去掉。所以 char
类型存储的字符串末尾不能有空格,varchar
不限于此。
2.char(n)
固定长度,char(4)
不管是存入几个字符,都将占用 4 个字节,varchar
是存入的实际字符数 +1 个字节(n<=255)或2个字节(n>255),所以varchar(4)
,存入 3 个字符将占用 4 个字节。
3.char
类型的字符串检索速度要比 varchar
类型的快。
varchar
和 text
:
1.varchar
可指定 n
,text
不能指定,内部存储 varchar
是存入的实际字符数 +1 个字节(n<=255)或 2 个字节(n>255),text
是实际字符数 +2 个字节。
2.text
类型不能有默认值。
3.varchar
可直接创建索引,text
创建索引要指定前多少个字符。varchar
查询速度快于 text
, 在都创建索引的情况下,text
的索引似乎不起作用。
BINARY
和 VARBINARY
类似于 CHAR
和 VARCHAR
,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB
是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB
类型:TINYBLOB
、BLOB
、MEDIUMBLOB
和 LONGBLOB
。它们区别在于可容纳存储范围不同。
有 4 种 TEXT
类型:TINYTEXT
、TEXT
、MEDIUMTEXT
和 LONGTEXT
。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
二、MySQL属性约束条件
MySQL关键字 | 含义 |
---|---|
NULL | 数据列可包含NULL值 |
NOT NULL | 数据列不允许包含NULL值 |
DEFAULT | 默认值 |
PRIMARY KEY | 主键 |
AUTO_INCREMENT | 自动递增,适用于整数类型 |
UNSIGNED | 无符号 |
ZEROFILL | 填充零 |
CHARACTER SET name | 指定一个字符集 |