1:数据类型分类
MySql的数据类型大体能够分为三类:数据库
2:各个数据类型的存储大小和取值范围spa
数字型:操作系统
定点数
定点数就是小数点前面的数字个数和小数点后面的数字个数都肯定的数字。
语法为3d
DECIMAL(M, N)
M: 全部的数字总个数
N: 小数点后面的数字个数code
DECIMAL(5, 2) 可表示的范围为 `-999.99`to`999.99`
对于定点数,数据库存的是确切值,而不是近似值,这点与浮点数不一样。blog
确切值,就是指数据库存的时候不会作四舍五入。你给的是什么值,在数据库里面存的就是什么值。排序
可是,当给的数超过了设置的位数,存入数据库怎么处理,依赖于具体的操做系统,可是通常来讲会直接截掉超出位数的部分。事务
浮点数:
语法:ci
FLOAT(M, N), DOUBLE(M, N)
M: 总的数字个数
N: 小数点后面的数字个数
例如:字符串
FLOAT(7, 4)能够表示`-999.9999`
浮点数的问题:
对于定义了FLOAT(7, 4)的数值,若是数字是999.00009,由于超过了定义的位数,当存入数据库的时候,MySql会进行四舍五入,因此最后在数据库里获得的数字是999.0001。
因此,若是你对数据库里面的浮点数作比较,经常可能会出问题,由于数据库在存浮点数的时候存的是一个近似值,而不是确切值。
字符型:
CHAR vs VARCHAR
char:char是定长,若是存入的数据不够定义的那么长会用空格补全。可是读取数据的时候,会自动把空格去掉。
varchar: varchar是变长,在数据库里所占的位数根据存入的数据字符长度而变化。在读取数据的时候,也不会自动把空格去掉。
下图很直观地展现了char和varchar在存储的时候的区别:
定义字符型列
CREATE TABLE t ( c1 VARCHAR(20) CHARACTER SET utf8, c2 TEXT CHARACTER SET latin1 COLLATE latin1\_general\_cs );
定义字符型的时候,通常根据你的需求定义字符集。经过"CHARSET SET"或者"charset".
枚举类型
CREATE TABLE shirts ( name VARCHAR(40), size ENUM('x-small', 'small', 'medium', 'large', 'x-large') );
能够经过"enum_col"来获取枚举数据的index。可是,注意,枚举的index不是数据库表的index,两者之间没有关系。
上图展现了枚举类型的index。空字符串的index都是0,NULL的index为NULL。
枚举的排序
默认状况下,枚举的排序是按照枚举的index。不少时候默认排序没法知足你的需求,为了不这种状况:
1:可使用ORDER BY CAST或者ORDER BY CONCAT。
2:或者按照字母顺序存入枚举数据。
数字型的枚举
使用数字(1)或者数字字面量("1")做为枚举,都是不推荐的作法。缘由咱们经过如下的一个例子来讲明。
1: 假设咱们定义了一个数字字面量的枚举类型的列:numbers
numbers ENUM('0','1','2')
2: 咱们依次存入:2, '2', 3
3: 那最后咱们在数据库里获得的数据是:'1', '2', '2'
咱们之因此获得'1', '2', '2'的缘由是:
1:当咱们存入2的时候,2被解释成枚举的index. 当index=2的时候,对应的枚举值是'1',因此存入数据库里面第一个值是'1'。
2:当咱们存入'2'的时候,'2'是ENUM('0','1','2')里的一个合法值,因此被正确地存入数据库,获得'2'。
3:当咱们存入'3'的时候,'3'不在枚举的范围内,因此被当成了index。当index=3时,对应的枚举值是'2'。
经过以上这个例子,咱们能够看到若是把数字字面量做为枚举,将会产生意想不到的bug。因此,最好不要使用数字字面量做为枚举。
Set类型
语法:
SET('one', 'two')
读取Set数据:
SELECT set_col+0 FROM tbl_name;
时间和日期:
1:时间和日期有哪三种类型?
DATE, DATETIME, TIMESTAMP
DATE: 使用"yyyy-mm-dd"的格式表示。DATE只能表示日期,不能有具体的时间(点钟)。取值范围为'1000-01-01' ~ '9999.12.31'。
DATETIME: 使用"yyyy-mm-dd hh:mm:ss"格式表示。DATETIME表示既有日期又又具体点钟的时间。可取值范围为
'1000-01-01 00:00:00' ~ '9999.12.31 23:59:59'。
TIMESTAMP: TIMESTAMP可用来表示带有时区的时间。它的可取值范围为'1970-01-01 00:00:01'UTC ~ '2038-01-19 03:14:07'UTC。
2:时间和日期有哪些注意的点?
DATE,DATETIME都是不带时区的,TIMESTAMP是带时区的。当存TIMESTAMP数据的时候,MySql把当前的时区转换为UTC;读取TIMESTAMP数据的时候,又从UTC时区转化为当前的时区。
3:mySql对于不合法的日期和时间是怎么处理的?
对于不合法的日期,例如'2000-45-50',或者'2004-04-31',MySql会把他们转化为'0000-00-00'(非严格模式),或者直接获得error(严格模式)
4:mySql对2位数的年怎么处理?
insert或者update时数据的默认值
1:能够在定义列的时候明确地给出默认值:
create table t1(age INT DEFAULT 0);
2: 若是没有在定义的时候给出明确的默认值:
若是在insert或者update的时候给不能是null的列,没有提供明确的值,那么MySql会按照下面的逻辑处理:
严格模式下,
非严格模式下,
那么,不一样的数据类型的默认值是什么呢?
不一样数据类型的默认值
数值类型:默认值为0。若是设置了AUTO_INCREMENT,则是自动增加的值。
DATE,DATETIME:默认值是对应的'0'值。
TIMESTAMP:
若是开启了explicit_defaults_for_timestamp, 默认值也是对应的'0'值。 若是没有开启explictit_defaults_for_timestamp, 默认值就是此刻的时间值。
除了ENUM以外的字符串类型: 默认值是空字符串
ENUM类型:默认值是ENUM的第一个元素值。