数据类型与约束
数据类型
使用MySQL数据库存储数据时,不同的数据类型决定了MySQL存储数据方式的不同。MySQL数据库提供了多种数据类型,其中包括数字类型、时间和日期类型、字符串类型。
数字类型
整数类型
数据类型 | 字节数 | 无符号数的取值范围 | 有符号数的取值范围 |
---|---|---|---|
TINYINT | 1 | 0~255 | -128~127 |
SMALLINT | 2 | 0~65535 | -32768~32767 |
MEDIUMINT | 3 | 0~16777215 | -8388608~8388607 |
INT | 4 | 0~4294967295 | -21447483648~2147483647 |
BIGINT | 8 | 0~18446744073709551615 | -9223372036854775808~92233720368547758807 |
占用字节数最小的是TINYINT,占用字节数最大的是BIGINT。不同整数类型的取值范围可以根据字节数计算出来,例如,TINYINT类型的整数占用1字节,1字节是8位,那么,TINYINT类型无符号数的最大值就是 2^8 -1(即255),有符号数的最大值就是 2^7 -1(即127)。
若使用无符号数据类型,需要在数据类型右边加上UNSIGNED关键字来修饰,例如,INT UNSIGNED表示无符号INT类型。
使用 ZEROFILL 可以对数据进行零填充。若数值宽度小于显示宽度,会在左侧填充0。设置零填充后,字段自动设为无符号类型,因为负数不能使用零填充。
CREATE TABLE my_int2 (
int_1 INT(3) ZEROFILL;
int_2 TINYINT(6) ZEROFILL
);
浮点数类型
在MySQL中,存储的小数都是使用浮点数或定点数来表示的。浮点数的类型有两种,分别是单精度浮点数类型(FLOAT)和双精度浮点数类型(DOUBLE),对应的字节大小及取值范围如下所示:
数据类型 | 字节数 | 负数的取值范围 | 非负数的取值范围 |
---|---|---|---|
FLOAT | 4 | -3.402823466E+38~ -1.175494351E-38 |
0和1.175494351E-38~ 3.402823466E+38 |
DOUBLE | 8 | -1.7976931348623157E+308~ -2.2250738585072014E |
0和2.2250738585072014E-308~ 1.7976931348623157E+308 |
主键的数据类型
表的主键推荐使用整数类型,与字符串相比,整数类型的处理效率更高,查询速度更快。
数据类型如何设计
在选择数据类型时,若一个数据将来可能参与数学计算,推荐使用整数、浮点数或定点数类型;若只用来显示,则推荐使用字符串类型。例如商品库存可能需要增加、减少、求和等,所以保存为整数类型;用户的身份证、电话号码一般不需要计算,可以保存为字符串类型。
数据类型转换?
当插入的值的数据类型与字段的数据类型不一致,或使用ALTER TABLE修改字段的数据类型时,MySQL会尝试尽可能将现有的值转换为新类型。例如,字符串‘123’、‘-123’、‘1.23’与数字123、-123、1.23可以相互转换;1.5转换为整数时,会被四舍五入,结果为2。