数字
整数类型:整型的长度约束,实际上没有效果
tinyinit
有负号(默认): -128 ~ 127 超过报错(可以调整sql_mode,让其不报错)
create table 表名(字段名 tinyint);
insert into t1 values (-128);
无符号: 0-255 超过报错(可以调整sql_mode,让其不报错)
create table 表名(字段名 tinyint unsigned);
int
有符号(负号): -2147483648 ~ 2147483647 超过报错(可以调整sql_mode,让其不报错)
create table 表名(字段名 int);
无符号: 0 ~ 4294967295 超过报错(可以调整sql_mode,让其不报错)
create table 表名(字段名 int unsigned);
bigint
有符号: -9223372036854775808 ~ 9223372036854775807 超过报错(可以调整sql_mode,让其不报错)
create table 表名(字段名 bigint);
无符号: 0 ~ 18446744073709551615 超过报错(可以调整sql_mode,让其不报错)
create table 表名(字段名 bigint unsigned);
浮点型:
decimal: 推荐使用,准确的小数值,m最大值为65位(包含d的位数),d最大值为30位小数
create table 表名(字段名 decimal(65,30));
insert into t1 values(1.1111111111111111111111111111111);
float: 随着小数的增多,精度变得不准确,m最大值为256位(包含d的位数),d最大值为30位小数
有符号: -3.402823466E+38 ~ -1.175494351E-38,1.175494351E-38 ~ 3.402823466E+38
create table 表名(字段名 floact(m,d))
无符号:
1.175494351E-38 ~ 3.402823466E+38
double: 随着小数的增多,精度比float要高,但也会变得不准确,m最大值为256位(包含d的位数),d最大值为30位小数
有符号: -1.7976931348623157E+308 ~ -2.2250738585072014E-308,2.2250738585072014E-308 ~ 1.7976931348623157E+308
create table 表名(字段名 double(m,d));
无符号: 2.2250738585072014E-308 ~ 1.7976931348623157E+308
字符串:
char(10): 简单粗暴,浪费空间(字符字符串不足10个也存储10个),存取速度快,字符长度范围: 0-255(一个中文是一个字符,是utf8编码的3个字节)
检索: 在检索或者说查询时,查出的结果会自动删除尾部的空格,如果你想看到它补全空格之后的内容,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';)
varchar: 准确,节省空间,存取速度慢, 字符长度范围: 0-65535(如果大于21845会提示用其他类型 mysql行最大限制为65535字节,字符编码为utf-8
存储: varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来
强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
检索: 尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
length(字段):查看该字段数据的字节长度
char_length(字段):查看该字段数据的字符长度
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串.也就是说,它们包含字节字符串而不是字符字符串,这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象,可以容纳可变数量的数据.有 4 种BLOB类型: TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB.它们区别在于可容纳存储范围不同.
有 4 种 TEXT 类型: TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT.对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择.
BLOB:
1._BLOB和_text存储方式不同,_TEXT以文本方式存储,英文存储区分大小写,而_Blob是以二进制方式存储,不分大小写
2._BLOB存储的数据只能整体读出
3._TEXT可以指定字符集,_BLO不用指定字符集
sql优化建议:创建表时,定长的类型往前放(比如性别),变长的往后放(比如描述信息)
大于255个字符,超了就把文件路径存放在数据库中,(比如视频,数据库中只存路径或url)
时间类型:
YEAR: 范围1901 ~ 2155
DATE: 范围1000-01-01 ~ 9999-12-3
TIME: 范围-838:59:59 ~ 838:59:59
DATETIME(一般都用): 范围1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
create table t1(x datetime not null default now()); #获取当前时间
IMESTAMP: 范围1970-01-01 00:00:00 ~ 2037
create table t3(time timestamp);
insert into t3 value(); #插入当前时间
MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,下面就来总结一下两种日期类型的区别:
1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年
2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区.在mysql服务器,操作系统以及客户端连接都有时区的设置.
3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节.因此TIMESTAMP比DATETIME的空间利用率更高
4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间
create table 表名(字段名 类型);
create table t2 (d date,t time,dt datetime);
insert into t2 values('1000-01-01','-838:59:59','9999-12-31 23:59:59');
insert into t11 values(now(),now(),now()); #插入当前时间
枚举类型与集合类型
字段的值只能在给定范围中选择,如单选框,多选框,如果你在应用程序或者前端不做选项限制,在MySQL的字段里面也能做限制
enum 单选+只能选枚举范围里的 只能在给定的范围内选一个值
create table t1 (name char(20),gender enum('female','male'));
insert into t1 value('bob','male');
set 多选+去重+只能选在集合里的 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
create table t2 (name char(20),hobby set('抽烟','喝酒','烫头'));
insert into t2 values('jack','喝酒,抽烟,烫头');