MySQL数据类型及后面小括号的意义

Posted The snail

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据类型及后面小括号的意义相关的知识,希望对你有一定的参考价值。

参考from:

MySQL数据类型及后面小括号的意义

1,数值类型

  1.1数值类型的种类

  标准 SQL 中的数值类型,包括严格数值类型(INTEGER、SMALLINT、DECIMAL、NUMERIC),以及近似数值数据类型(FLOAT、REAL、DOUBLE PRECISION)。

  mysql在此基础上又扩展了TINYINT、MEDIUMINT 和 BIGINT 这 3 种长度不同的整型,并增加了 BIT 类型,用来存放位数据。

  对于小数的表示,MySQL 分为两种方式:浮点数和定点数。浮点数包括 float(单精度)和 double(双精度),而定点数则只有 decimal 一种表示。定点数在 MySQL 内部以字符串形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。 

  浮点数和定点数都可以用类型名称后加“(M,D)”的方式来进行表示,“(M,D)”表示该值一共显示 M 位数字(整数位+小数位),其中 D 位位于小数点后面,M 和 D 又称为精度和标度。例如,定义为 float(7,4)的一个列可以显示为-999.9999。MySQL 保存值时进行四舍五入,因此如果在float(7,4)列内插入 999.00009,近似结果是 999.0001。 



    1.2数值类型的显示宽度

  对于5种整数类型(tinyint、smallint、mediumint、int、bigint),MySQL 还支持在类型名称后面的小括号内指定显示宽度(并不是该类型占用字节数)。

  例如 int(5)表示当数值宽度小于 5 位的时候在数字前面填满宽度,如果不显示指定宽度则默认为 int(11)。一般配合 zerofill 使用,顾名思义,zerofill 就是用“0”填充的意思,也就是在数字位数不够的空间用字符“0”填满。以下几个例子分别描述了填充前后的区别。

 (1)创建表 t1,有 id1 和 id2 两个字段,指定其数值宽度分别为 int 和 int(5)。
        

(2)在 id1 和 id2 中都插入数值 1,可以发现格式没有异常。
        

(3)分别修改 id1 和 id2 的字段类型,加入 zerofill 参数:
        

  设置了宽度限制后,如果插入大于宽度限制的值,会不会截断或者插不进去报错?答案是肯定的:不会对插入的数据有任何影响,还是按照类型的实际精度进行保存,这是,宽度格式实际已经没有意义 。

        

    1.3数值类型的属性

    (1)UNSIGNED(无符号) ,如果需要在字段里面保存非负数或者需要较大的上限值时,可以用此选项,它的取值范围是正常值的下限取 0,上限取原值的 2 倍,例如,tinyint 有符号范围是-128~+127,而无符号范围是 0~255。如果一个列指定为 zerofill,则 MySQL 自动为该列添加 UNSIGNED 属性。 

    (2)AUTO_INCREMENT ,在需要产生唯一标识符或顺序值时,可利用此属性,这个属性只用于整数类型。AUTO_INCREMENT 值一般从 1 开始,每行增加 1。 一个表中最多只能有一个 AUTO_INCREMENT列 。对于任何想要使用 AUTO_INCREMENT 的列,应该定义为 NOT NULL,并定义为 PRIMARY KEY 或定义为 UNIQUE 键。 例如,可按下列任何一种方式定义 AUTO_INCREMENT 列: 

    

 

2,日期时间类型

  MySQL 5.0 中所支持的日期和时间类型

  • 如果要用来表示年月日,通常用 DATE 来表示。 
  • 如果要用来表示年月日时分秒,通常用 DATETIME 表示 。
  • 如果只用来表示时分秒,通常用 TIME 来表示 。
  • 如果需要经常插入或者更新日期为当前系统时间,则通常使用 TIMESTAMP 来表示。TIMESTAMP 值返回后显示为“YYYY-MM-DD HH:MM:SS”格式的字符串,显示宽度固定为 19 个字符。如果想要获得数字值,应在 TIMESTAMP 列添加+0。 
  • 如果只是表示年份,可以用 YEAR 来表示,它比 DATE 占用更少的空间。YEAR 有 2 位或4 位格式的年。默认是 4 位格式。 

 3,字符串类型   

    

  CHAR 和 VARCHAR 很类似,都用来保存 MySQL 中较短的字符串。二者的主要区别在于存储方式的不同:CHAR 列的长度固定为创建表时声明的长度,长度可以为从 0~255 的任何值(即指定长度是4的话,存的字符串长度必须是4);而 VARCHAR 列中的值为可变长字符串,长度可以指定为 0~255 (5.0.3 以前)或者 65535 (5.0.3以后)之间的值(即指定长度是4的话,存的字符串长度最大是4,1、2、3、4都可以)。

 

MySQL数据类型补充

数据类型

整数数据类型

特殊说明:

​ 对于整数类型,MySQL还支持在类型名称后面加小括号(M),而小括号中的M表示显示宽度,M的取值范围是(0, 255)。int(M)这个M在字段的属性中指定了unsigned(无符号)和zerofill(零填充)的情况下才有意义。表示当整数值不够M位时,用0填充。如果整数值超过M位但是没有超过当前数据类型的范围时,就按照实际位数存储。当M宽度超过当前数据类型可存储数值范围的最大宽度时,也是以实际存储范围为准。

​ MySQL8之前,int没有指定(M),默认显示(11)。最多能存储和显示11位整数。从MySQL 8.0.17开始,整数数据类型不推荐使用显示宽度属性,默认显示int。

字符串类型

时间类型

date_format时间格式化方法

说明符 描述
%a 缩写的工作日名称 ( Sun.. Sat)
%b 缩写月份名称 ( Jan.. Dec)
%c 月份,数字 ( 0.. 12)
%D 带有英文后缀 ( 0th, 1st, 2nd, 3rd, …)
%d 一个月中的第几天,数字 ( 00.. 31)
%e 一个月中的第几天,数字 ( 0.. 31)
%f 微秒 ( 000000.. 999999)
%H 小时 ( 00.. 23)
%h 小时 ( 01.. 12)
%I 小时 ( 01.. 12)
%i 分钟,数字 ( 00.. 59)
%j 一年中的第几天 ( 001.. 366)
%k 小时 ( 0.. 23)
%l 小时 ( 1.. 12)
%M 月份名称 ( January.. December)
%m 月份,数字 ( 00.. 12)
%p AM或者PM
%r 时间,12 小时(hh:mm:ss后跟 AMPM
%S 秒 ( 00.. 59)
%s 秒 ( 00.. 59)
%T 时间,24 小时 ( hh:mm:ss)
%U 周 ( 00.. 53),其中星期日是一周的第一天; WEEK()模式 0
%u 周 ( 00.. 53),其中星期一是一周的第一天; WEEK()方式一
%V 周 ( 01.. 53),其中星期日是一周的第一天; WEEK()方式二;与 %X
%v 周 ( 01.. 53),其中星期一是一周的第一天; WEEK()模式 3;与 %x
%W 工作日名称 ( Sunday.. Saturday)
%w 星期几(0=Sunday.. 6=Saturday)
%X Year for week where Sunday is the first day of the week, numeric, 四位数字;与%V
%x Year for week,其中Monday为一周的第一天,numeric,四位;与%v
%Y 年份,数字,四位数字
%y 年份,数字(两位数)
%% 文字%字符
%*x* x, 对于上面未列出的任何 “ x

语法:

date_format(date, 格式化的字符串);

日期相加减函数:

date_sub时间减法

语法:

date_sub(date,interval 要减去的时间[int] 类型[年月日时分秒毫秒微秒])

date_add时间加法

语法:

date_add(date, interval 要添加的数值[int] 添加数值的单[年月日时分秒毫秒微妙])

Json类型

JSON_SET(), JSON_INSERT(), 和JSON_REPLACE()函数是相关的。

JSON_SET()替换现有的值并增加非现有的值。

JSON_INSERT()插入数值而不替换现有的数值。

JSON_REPLACE()只替换现有的值。

以上是关于MySQL数据类型及后面小括号的意义的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据类型

mysql数据类型/注意事项/int(20)混淆

PostgreSQL 数组类型

python中在函数后面有一个小括号和一个中括号是啥意思

MySQLMySQL知识总结

mysql的基本数据类型