目录
- 整数类型:tinyint、smallint、mediumint、nt、bigint
- 日期类型:date、time、datetime、timestamp、year
数据类型
- 整数类型:tinyint、smallint、mediumint、nt、bigint
- tinyint
小数型,数据类型用于保存一些范围的整数数值范围。
范围:
- 有符号:-128~127
- 无符号:0~255
注:MySQL没有布尔值,使用tinyint(1)构造
- int
整数,数据类型用于保存一些范围的整数数值范围。
范围:
- 有符号:-2147483648 ~ 2147483647
- 无符号 : 0 ~ 4294967295
- bigint
大整数,数据类型用于保存一些范围的整数数值范围。
范围:
- 有符号:-9223372036854775808 ~ 9223372036854775807
- 无符号 : 0 ~ 18446744073709551615
- 整型存储范围
注:数据类型指定的宽度,例如 int(5),5指的是查询结果的显示宽度,与存储范围无关。默认的显示宽度为最大值+1。
另:
int的存储宽度是4个Bytes,即32个bit,即2**32
无符号最大值为:4294967296-1
有符号最大值:2147483648-1
有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的
即:整形类型,其实没有必要指定显示宽度,使用默认的即可
- 浮点类型:float、double
- float
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30。
范围:
- 有符号:
-3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38- 无符号:
1.175494351E-38 to 3.402823466E+38- 精确度:随着小数的增多,精度变得不准确
- double
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
双精度浮点数(非精确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
范围:
- 有符号:
-1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308- 无符号:
2.2250738585072014E-308 to 1.7976931348623157E+308- 精确度:随着小数的增多,精度比float要高,但也会变得不准确
- DECIMAL(定点数类型)
dec同decimal
decimal[(m[,d])] [unsigned] [zerofill]
精确的小数值,m是数字总个数(负号不算),d是小数点后个数。m最大值为65,d最大值为30、
精确度:
- **** 随着小数的增多,精度始终准确 ****
- 对于精确数值计算时需要用此类型
- decaimal能够存储精确值的原因在于其内部按照字符串存储。
- 字符串类型:char、varchar
- char
char(n)
用来固定长度的字符串,n为字符长度范围 0~255(一个中文是一个字符,是utf8编码的三个字节),超出范围报错
存储:默认会往右填充空格满足指定长度。
如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储
检索:在检索(查询)时,查出的结果会自动删除尾部空格。除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';)
- varchar
varchar(n)
用来存储变长字符类型,n为字符长度范围 0~65535(如果大于21845会提示用其他类型),超出范围报错
存储:
- 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)
检索: 尾部有空格会保存下来,在检索(查询)时,也会正常显示包含空格在内的内容
- char vs varchar
- char:固定长度,浪费空间,存取速度快
- varchar:可变长度,节省空间,存取速度慢
总结:innoDB引擎:建议使用varchar类型。
- 位类型:bit
-BIT
BIT(M)
存放二进制数,M范围 1~64,默认为1位
注意:
- 对于位字段需要使用函数读取
- bin()显示为二进制
- hex()显示为十六进制
- 日期类型:date、time、datetime、timestamp、year
YEAR YYYY(1901/2155) DATE YYYY-MM-DD(1000-01-01/9999-12-31) TIME HH:MM:SS('-838:59:59'/'838:59:59') DATETIME YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y) TIMESTAMP YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
- datetime & timetamp
在实际应用的很多场景中,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语句中没有指定该列的更新值,则默认更新为当前时间。即,timestamp只要动了对应行数据,会自动更新修改时间。
- 枚举 and 集合
枚举(enum):字段的值只能在给定范围中选一个(单选)
sex enum('male','female');
集合(set):字段的值只能在给定范围中选择(可多选)
hobby set('play','music','read','study') :
严格模式
如果插入的数字不在相应类型的范围内,依旧可以插入。
严格模式:如果插入数字不在相应范围内,则报错。
设置方式:
- 查看当前模式 : show variables like "sql_mode";
- 修改为严格模式:set global sql_mode = "STRICT_TRANS_TABLES";
- 不需要重启,直接可以执行。