一、类型属性
比如两个属性相减,
建议设置严格模式;如下:
则终端当前操作不影响非事务表(myisam).
2)ALLOW_INVILID_DATES:该模式不完全对日期合法性检验,只检查范围;
3)ANSI_QUOTES:启用后不能用双引号引用字符串
4)ERROR_FOR_DIVISION_BY_ZERO:该模式除0会错误,,如果未给出该模式,返回结果null;
);如果启用higt_not_precedence模式,则NOT优先级更高
6)IGNORE_SPACE:函数名和括号之间有空格
7)no_auto_create_user:禁止GRANT创建密码为空的用户;
8)NO_AUTO_VALUE_ON_ZERO:影响插入0或null代表下一个自增长值;
directory;
11)NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或者未编译,跑出错误,用默认的替代.
unsigned类型相减返回signed类型;
而启用后,则不允许零日期插入,会抛出错误;
mysql会直接抛出错误;
15)ONLY_FULL_GROUP_BY:对于group by的聚合操作,如果select的列不在group by中,是不合法的SQL
18)REAL_AS_FLOAT:将REAL视为FLOAT的同义词而不是double的同义词;
19)STRICT_ALL_TABLES:对所有引擎的表都启用严格模式
日期和时间类型
Date占3字节;
TIMESTAMP和datetime比较
timestamp占用4个字节比较小;(建议使用)
建表时 timestamp可以设置默认值,datetime列不行;
更新表时,可以设置timestamp的日期类型的列自动更新为当前时间;
YEAR:例如2020
TIME:例如12:12:12
日期函数
now(), current_timestamp(), sysdate()
-- current_timestamp() 和now() 相同;
sysdate()函数返回的是执行到当前函数的时间,而now()返回的是执行sql语句的时间
date_sub
-- 加减 (interval后面可以接负数)
select now() as 现在,
date_add(now(), interval 1 day) as 明天,
date_sub(now(), interval 1 day) as 昨天,
date_sub(now(), interval -1 day) as 明天;
-- 结果: 2020-05-30 16:05:53,2020-05-31 16:05:53,2020-05-29 16:05:53
注意:不会走索引
select date_format(now(), '%Y-%m-%d %H:%m:%s') as 年月日时分秒,
date_format(now(), '%Y') as 年
;
-- 2020-05-30 16:05:50 ,2020
四、星期数的问题 ;
-- 周六 结果是5 , 返回值0-6,(0是Monday)
weekday(now()) ;
-- 周六 结果是7,返回值1-7,(1代表Sunday)
dayofweek(now())
-- Saturday
dayname(now()) ;
week(now()) ;
-- 结果 : 21 (2020-01-01为第一周, 国外周日作为一个星期的开始)
五、数字类型
INT(4字节)<BIGINT(8字节)
浮点型(非精确类型):FLOAT,DOUBLE PRECISION,
高精度类型:DECIMAL,NUMERIC
六、字符类型
utf 8 字符集,如果需要存储表情,那么选择 utf8mb4 来进行存储,注意它与 utf8 编码的区别;
1) CHAR和VARCHAR
CHAR定长(自动右扩充),VARCHAR变长;
2) BINARY和VARBINARY
类似上面的char和varchar,不过存储的是二进制的字符串;
3) BLOB和TEXT
BLOB是用来存储二进制大数据类型的;
BOLB和TEXT类型创建索引时,必须制定索引前缀的长度,不能有默认值;
排序时只是用前max_sort_length个字段;
INnoDB只存储前20个字节,二完整数据则放在BLOB的行溢出页中,提高查询效率;
4) ENUM和SET类型
都是集合类型,不过元素个数前者>后者;