关于MySQL数据类型的一些注意问题

用了3年的MySQL了,一直对这方面比较忽视,总是固定套着SQL模板写,很多细节方面没有注意,今天详细的看了一下MySQL方面的书籍,特意记下来,希望能够重视这些小问题。

1、整数类型

1)长度排序:TINYINT(1字节,-128~127) <  SMALLINT(2字节) < MEDIUMINT(3字节) < INT(4字节) <  BIGINT(8字节)。由此可见,int类型的长度还是很长的。

2)NUMERIC和DECIMAL类型 属于可指定小数位和整数位的类型,往往用于存储 货币或有精度要求的存储。如:NUMERIC(5,2),但是要注意的是,

无论NUMERIC还是DECIMAL,括号里的第一位表示的是有效数字长度,第二位表示的是小数点后的位数

如:NUMERIC(5,2)的范围是  -999.99~999.99,而不是 -99999.99~99999.99, 上述的5 代表的是有效数字长度。

2、日期和时间

1)DATE 只记录日期,有年、月、日,但不记录时间,从DATE 转换为DATETIME或TIMESTAMP,得到的是 ‘YYYY-MM-DD 00:00:00’。

2)DATETIME除了范围比TIMESTAMP广以外,TIMESTAMP的主要优势在于:

UPDATE的时候,如果TIMESTAMP的新值和原来的值一样,MySQL会忽略这更改(提高效率)

INSERT插入数据的时候,如果TIMESTAMP没赋值,其会自动默认有插入值插入当前时间!连续的TIMESTAMP只会默认插入第一个为当前时间。

3)Year 如果只插入或更新两位数,这两位数小于等于69,则对应的是2000~2069 年份,如果大于等于70,则对应的是1970~1999年份。

3、字符串

1)长度小于 4 的 VARCHAR 被改变为 CHAR。

2)如果在一个表中的任何列有可变长度,结果是整个行是变长的。

在这种情况下,如果一张表包含任何变长的列(VARCHAR、TEXT 或 BLOB),所有大于 3 个字符的 CHAR列被改变为 VARCHAR列。

3)BLOB和 TEXT类型的唯一区别是,BLOB类型在排序时区分大小写,而TEXT不区分。

4)由于 BLOB 和 TEXT 值的大小变化很大,如果进行的删除和更新很多,则存储它们的表出现高碎片率会很高。应该定期地运行 OPTIMIZE TABLE减少碎片率以保持良好的性能。

4、ENUM和 SET 类型区别

1)ENUM 固定占两个字节,可以有 65535 个成员。SET 为可变长,最多占8个字节,最多可有64个成员

2)ENUM 的值只能是成员中的一个,而SET的值可以为多个成员,甚至空字符串(“”),表示没有任何成员。

ENUM和SET都可存放NULL值,只要没有指定为NOT NULL的话。

如:color ENUM(―red,black,green,yellow)

property SET(―car,house,stock) NOT NULL

那么 color 和 property 可能的值分别为:
color:NULL、red、black、green和yellow
而 property 可能的值就复杂的多:

―car
―house
―car,house
―stock
―car,stock
―house,stock
―car,house,stock

造成这种原因是因为:

ENUM 的值存储方式是一个数值对应一个成员。这就意味着2个字节一共65536 个数值,就可以有65536 个成员。但是,0是ENUM 内置的错误成员,所以实际上最多只能有65535 个成员。

SET 是每一个二进制位对应一个成员,0表示这个成员存在,1表示不存在这就是为什么SET可以出现多个成员同时出现的情况,儿空字符串则相当于:00000000。对于大小为 1 到
8、9 到 16、17 到 24、25 到 32、33 到 64 个成员的集合,其 SET 值分别占用 1、2、3、4 或 8 个字节。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值