整型
类型 | 空间 | 说明(默认有符号) |
---|---|---|
TINYINT | 1字节 | 取值范围:-2^7 ~ 2^7-1 |
SMALLINT | 2字节 | 取值范围:-2^15 ~ 2^15-1 |
MEDIUMINT | 3字节 | 取值范围:-2^23 ~ 2^32-1 |
INT | 4字节 | 取值范围:-2^31 ~ 2^31-1 |
BIGINT | 8字节 | 取值范围:-2^63 ~ 2^63-1 |
值得注意的是,TINYINT(1)代表java语言中的boolean,1/0代表true/false。mysql本身没有boolean类型。
实数
类型 | 空间 | 说明(默认有符号) |
---|---|---|
FLOAT | 4字节 | 单精度,存在精度损失(7个有效位),取值范围:-3.402823466E+38 ~ -1.175494351E-38 |
DOUBLE | 8字节 | 双精度,存在精度损失(15个有效位),取值范围: -1.7976931348623157E+308 ~ -2.2250738585072014E-308 |
DECIMAL | DECIMAL(M,D),M+2字节 | M是数字的最大数目。其范围为1~65,M的默认值是10;D是小数点右侧数字的数目。其范围是0~30,但不得超过M。例如:DECIMAL(6,3),6 + 2 = 8字节,取值范围:-999.999 ~ 999.999(注意符号和小数点各占用一个字节) |
- 对于DECIMAL类型,Mysql5.0或者更高版本将数字打包保存到一个二进制字符串中(每4个字节存9个数字)。例如DECIMAL(18,9)小数两边各存储9个数字,一共使用9个字节:小数点前面4个字节,小数点本身一个字节,小数点后面4个字节。
- 浮点类型(FLOAT、DOUBLE)在存储同样范围的值时,通常比DECIMAL使用更少空间。所以应该尽量只对小数进行精确计算时才使用DECIMAL(例如财务数据)。
日期与时间
类型 | 空间 | 说明(默认有符号) |
---|---|---|
YEAR | 1字节 | 年份,格式:YYYY,范围:1901 ~ 2155 |
TIME | 3字节 | 时分秒,格式:HH:MM:SS,范围:-838:59:59 ~ 838:59:59 |
DATE | 3字节 | 年月日,格式:YYYY-MM-DD,范围:1000-01-01 ~ 9999-12-3 |
DATETIME | 8字节 | 年月日 时分秒,格式:YYYY-MM-DD HH:MM:SS,范围:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
TIMESTAMP | 4字节 | 年月日 时分秒(跟时区相关,按照UTC格式保存),格式:YYYY-MM-DD HH:MM:SS,范围:1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC |
字符串
类型 | 空间 | 说明(默认有符号) |
---|---|---|
CHAR | 最多255个字符 | 固定长度 |
VARCHAR | 最多65 535个字符 | 可变长度 |
TINYTEXT | 最多255个字符 | 短文本 |
TEXT | 最多65 535个字符 | 文本 |
MEDIUMTEXT | 最多16 777 215个字符 | 中等长度文本 |
LONGTEXT | 最多4 294 967 295个字符 | 超长文本 |
TINYBLOB | 最多255个字节 | 短二进制字符串 |
BLOB | 最多65 535个字节 | 二进制字符串 |
MEDIUMBLOB | 最多16 777 215个字节 | 中等长度二进制字符串 |
LONGBLOB | 最多4 294 967 295个字节 | 超长二进制字符串 |
-
CHAR与VARCHAR
- CHAR
- 是定长的,一开始分配固定的空间,不容易产生碎片;
- 当存储CHAR时,Mysql会删除所有的末尾空格;
- 适合存储很短且所有值长度接近的字符串;
- VARCHAR
- 是可变长度的,比定长类型更节省空间;
- VARCHAR = ‘1(值长度<=255)或2(值长度>255)个字节记录字符串长度’ + ‘值长度’;
- update操作时,有可能让值变长,会导致额外的工作(在页没有更多空间可以存储的时候,不同存储引擎处理方式是不一样的,例如MyISAM会将行拆成不同的片段存储,InnoDB采用页分裂方式);
- 指定大小不能过长,例如:使用VARCHAR(5)和VARCHAR(200)磁盘存储‘hello’的空间开销是一样的,但是更长的列会消耗更多的内存,因为MySql通常会按照指定的大小分配内存。
- CHAR
-
BLOB与TEXT
BLOB和TEXT都是为存储很大数据而设计的字符串数据类型,分别采用二进制和字符串方式存储。与其他类型不同,MySql把每个BLOB和TEXT值当做一个独立的对象处理。存储引擎在存储时,通常会做特殊处理。比如当BLOB和TEXT值太大,InnoDB会使用外部存储区域来存储,列只需要存储1~4个字节的指针,指针指向外部存储区域的值。
- BLOB:分为TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB;没有排序规则和字符集;
- TEXT:分为TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT;有排序规则和字符集。
位类型
类型 | 空间 | 说明 |
---|---|---|
BIT | BIT(n),n <= 64,n位 | 取值范围:0 ~ 2^n - 1 |
BIT(1)或者BIT,可以用来存储java语言中的boolean类型,1/0代表true/false。
需要注意的是,如果存储字符串,mysql会通过字符找到ASCII码对应的值存储,例如:存储一个字符串‘1’,得到的内容是ASCII码字符为‘1’对应值为49。
UPDATE users SET d = '1' WHERE id = '4';
image
image
那假设存字符串‘11’呢?UPDATE users SET d = '11' WHERE id = '4';
image
按照刚刚的逻辑可以看到,‘1’字符对应ASCII码值=49,二进制表示00110001;因此‘11’,二进制表示00110001 00110001,等于十进制的12593.
其他类型
BINARY、VARBINARY、ENUM、SET等