类型 占用字节 范围(有符号) 范围(无符号)
tinyint 1 (-128,127) (0,255)
smallint 2 (-32,768,32,767) (0,65 535)
mediumint 3 (-8,388,608,8,388,607) (0,16,777,215)
int 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)
| 类型 | 占用字节 | 范围(有符号) | 范围(无符号) |
| tinyint | 1 | (-128,127) | (0,255) |
| smallint | 2 | (-32,768,32,767) | (0,65 535) |
| mediumint | 3 | (-8,388,608,8,388,607) | (0,16,777,215) |
| int | 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) |
二、小数
- 如何设置无符号和有符号?
有符号 : 创建表时,默认设置是有符号的
无符号 : create table tab_int ( t1 INT UNSIGNED );#添加关键字UNSIGNED
- 当存入的数值超出范围如何显示?
当存入数值超出范围时,会自动将临界值存入数据库,Tinyint 类型的数据有符号范围是 -127-127,当存入的数据是-128,则会将-127存入数据库,如果存入的数是128,则会将127存入数据库
- 创建表时,相应的整数类型设置长度与数据保存范围有关吗?有什么作用?
创建表时设置长度对数据能存储数值的范围并没有影响,数据的存储范围和整数类型有关,-例如当你设置Tinyint的长度为11 但是仍然只能存-127-127范围的数值。
设置长度的作用时跟显示有关,当设置完长度后 加上关键字ZEROFILL ,如果保存的数据长度不够,就会用0填充长度到设置的长度,如果长度够了或者超出长度,都正常显示 例如:
CREATE TABLE ttt1 (
t1 TINYINT(10) ZEROFILL
);
创建了表ttt1 ,整数类型为TINYINT, 长度为10, 设置0填充当往数据库中存入10000时(INSERT into ttt1 value(10000))我们看看结果
设置了ZEROFILL之后,会自动变成无符号型,然后我们存入10000之后,超出了范围,所以保存了临界点225,由于设置了长度为10并且以0填充,所以就有了上面的结果。
1、浮点型
float(M,D)
double(M,D)
2、定点型
dec(M,D)
decimal(M,D)
三、字符型总结
M的意思是整数部分加小数部分的长度是M,D代表小数部分的长度,如果超出范围则自动存入临界值。如float(5,2)的数据类型中存入1200.65,存入数据库的值是999.99;
M和D都可以忽略(创建表的时候),如果是float或者是double,精度会随着 插入的值的变化而变化(只要在范围内可以随意插入数据) ,而dec则会默认给长度为(10,0),小数点后不能有数值。例如:
CREATE table floo(
f FLOAT,
d DOUBLE,
e dec
)INSERT INTO floo VALUES (9999.66,500.646,80000.656)
较短的文本
char(M) 固定长度的字符 , M最大字符数,比较耗费空间,但是效率高
varchar(M)可变长度的字符,M最大字符数,比较省空间,但是效率相对低
enum枚举
把不重复的数据存储为一个预定义的集合。
有时可以使用ENUM代替常用的字符串类型。
ENUM存储非常紧凑,会把列表值压缩到一个或两个字节。
ENUM在内部存储时,其实存的是整数。
尽量避免使用数字作为ENUM枚举的常量,因为容易混乱。
排序是按照内部存储的整数枚举建表
CREATE TABLE tab_char(
c ENUM('a','b','c')
);这样建表只能存入a,b,c中的一个,存入其他的就是空字符
INSERT into tab_char value('c')存入c可以正常存入
INSERT into tab_char value('d')
存入d就变成空字符
set集合
set数据类型建表
CREATE TABLE tab_set(
c SET('a','b','c','d')
);这样建表只能存入a,b,c中的一个或者多个,存入其他的就是空字符
较长的文本
text
blob(较大的二进制)
总结
四、日期型VARCHAR用于存储可变长字符串,它比定长类型更节省空间。
VARCHAR使用额外1或2个字节存储字符串长度。列长度小于255字节时,使用1字节表示,否则使用2字节表示。
VARCHAR存储的内容超出设置的长度时,内容会被截断。
CHAR是定长的,根据定义的字符串长度分配足够的空间。
CHAR会根据需要使用空格进行填充方便比较。
CHAR适合存储很短的字符串,或者所有值都接近同一个长度。
CHAR存储的内容超出设置的长度时,内容同样会被截断。使用策略:
对于经常变更的数据来说,CHAR比VARCHAR更好,因为CHAR不容易产生碎片。
对于非常短的列,CHAR比VARCHAR在存储空间上更有效率。
使用时要注意只分配需要的空间,更长的列排序时会消耗更多内存。
尽量避免使用TEXT/BLOB类型,查询时会使用临时表,导致严重的性能开销。
| 日期和时间类型 | 字节 | 最小值 | 最大值 |
| date | 4 | 1000-01-01 | 9999-12-31 |
| datetime | 8 | 1000-01-01 00:00:00 | 9999-12-31 :23:59:59 |
| timetamp | 4 | 19700101080001 | 2038年的某个时刻 |
| time | 3 | -838:59:59 | 838:59:59 |
| year | 1 | 1901 | 2155 |
其中 timetamp受时区影响,较能贴近本地当前时间,但是能表达的时间范围较小,在时间范围内尽量用timetamp作为时间类型,效率也高一点。datetime不受时区影响



