MySql 技术内幕 (数据类型)

一、类型属性

UNSIGNED: 数字类型无符号化,没有正负号,可能会给一些计算操作带来影响, 比如两个属性相减,

ZEROFILL: 自动填充0符号位,比如1填充成0001;

SQL_MODE: 可以进行一些非法操作,建议设置严格模式;如下:

  1)STRICT_TRANS_TABLES:该模式,如果一个值不能插入到一个事务表(例如innodb),则终端当前操作不影响非事务表(myisam).

  2)ALLOW_INVILID_DATES:该模式不完全对日期合法性检验,只检查范围;

  3)ANSI_QUOTES:启用后不能用双引号引用字符串

  4)ERROR_FOR_DIVISION_BY_ZERO:该模式除0会错误,,如果未给出该模式,返回结果null;

  5)higt_not_precedence_not:操作符优先顺序是表达式,比如NOT ( a between b );如果启用higt_not_precedence模式,则NOT优先级更高

  6)IGNORE_SPACE:函数名和括号之间有空格

  7)no_auto_create_user:禁止GRANT创建密码为空的用户;

  8)NO_AUTO_VALUE_ON_ZERO:影响插入0或null代表下一个自增长值;

  9)NO_BACKSLASH_ESCAPES:"\"作为普通字符而非转义符;

  10)NO_DIR_IN_CREATE:创建表时忽视所有index directory和data directory;

  11)NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或者未编译,跑出错误,用默认的替代.

  12)No_unsigned_subtraction:启用后,两个unsigned类型相减返回signed类型;

  13)NO_ZERO_DATE:非严格模式下,可以插入0000-00-00 00:00:00的非法日期,mysql发出警告,而启用后,则不允许零日期插入,会抛出错误;

  14)NO_ZERO_IN_DATE:严格模式下,不允许日期和月份为零,例如2011-00-01,mysql会直接抛出错误;

  15)ONLY_FULL_GROUP_BY:对于group by的聚合操作,如果select的列不在group by中,是不合法的SQL

  16)PAD_CHAR_TO_full_length:对于CHAR类型字段,不要阶段空洞数据(自动填充0x20的数据)),比如长度CHAR(10)存一个"a",显示长度是1,实际存储长度是10;

  17)PIPES_AS_CONCAT: 将"||"视为字符串的连接操作符,而非或运算符,和concat函数类似;

  18)REAL_AS_FLOAT:将REAL视为FLOAT的同义词而不是double的同义词;

  19)STRICT_ALL_TABLES:对所有引擎的表都启用严格模式

下面是组合选项:
  1. ANSI: REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE
  2. oracle
  3. TRADITIONAL
  4. MSSQL
  5. DB2
  6. MYSQL323
  7. MYSQL40
  8. MAXDB

二、日期和时间类型

 

datetime 站8字节,即显示时间日期;

Date占3字节;

mysql支持例如 2011-01-01 00:01:10, 2011/01/01 00+01+1, 20110101000110, 11/01/01 00@01@10等形式,"11/"开头会被视为离最近时间进的年份;

TIMESTAMP和datetime比较

显示内容是一样的,不过timestamp占用4个字节比较小;(建议使用)

建表时 timestamp可以设置默认值,datetime列不行;

更新表时,可以设置timestamp的日期类型的列自动更新为当前时间;

YEAR:例如2020

TIME:例如12:12:12

 

三、日期函数

now(),    current_timestamp(),  sysdate()

--  current_timestamp() 和now() 相同;

-- sysdate()函数返回的是执行到当前函数的时间,而now()返回的是执行sql语句的时间

时间加减函数 date_add   ,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

date_format函数,格式化打印日期-->注意:不会走索引

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)

select  weekday(now()) ;

-- 周六 结果是7,返回值1-7,(1代表Sunday)

select  dayofweek(now()) 

-- Saturday

 select  dayname(now()) ;

 select  week(now()) ;

-- 结果 : 21  (2020-01-01为第一周, 国外周日作为一个星期的开始)

 

五、数字类型

整型:TINYINT(1字节)<SMALLINT(2字节)<MEDIUMINT(3字节)<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类型

都是集合类型,不过元素个数前者>后者;

 
posted @ 2020-05-30 22:26  将军上座  阅读(67)  评论(0编辑  收藏  举报