MySQL的常见数据类型

我们在进行数据库的设计中设计表的时候需要考虑选择合适的数据类型, 比如年龄,需要的是无符号的,那么 tinyint 就足够了,不必须非得要int型的, 这样可以节省数据空间,也是一种优化。
整型:
类型: 字节: 有符号 无符号
tinyint: 1个字节 -128 —127 0 –255
smallInt: 2个字节 -32768 — 32767 0 —65535
mediumint 3个字节 0 —- 2 (24) -1
int 4个字节
bigint 8个字节

浮点型小数:
float[(M, D)] 单精度小数, 一般最高精确到保留小数点到7位, M是数字总位数, D是小数点后面的位数
double[(M, D)] 双精度小数,一般最高精确到保留小数点到14位,

定点型小数
decimal 和numeric 类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值。
DECIMAL(M,D),其中M表示十进制数字总的个数,D表示小数点后面数字的位数,假如取值范围为-999.99~999.99。
如果存储时,整数部分超出了范围(如上面的例子中,添加数值为1000.01),MySql就会报错,不允许存这样的值。
如果存储时,小数点部分若超出范围,就分以下情况:
若四舍五入后,整数部分没有超出范围,则只警告,但能成功操作并四舍五入删除多余的小数位后保存。如999.994实际被保存为999.99。
若四舍五入后,整数部分超出范围,则MySql报错,并拒绝处理。如999.995和-999.995都会报错。
M的默认取值为10,D默认取值为0。如果创建表时,某字段定义为decimal类型不带任何参数,等同于decimal(10,0)。带一个参数时,D取默认值
M的取值范围为1~65,取0时会被设为默认值,超出范围会报错。
D的取值范围为0~30,而且必须<=M,超出范围会报错。

时间日期型 用的比较少, 一般会采用数字类型来取代它
year 年 1901 - 2155
time
date 年月日 1000年的 1月1号 到9999年的12 月31 号
datetime 年月日时分秒 1000年的 1月1号 0点0分0秒 到9999年的12 月31 号 23点59分59秒
timestamp 时间戳 年月日时分秒 1970年的1月1号 -2037 年

字符型
char(M) 定长字符 M :[0 ,255], 比如定义了 char(5), 实际存储的时候还是会占用5个字节长度,即使实际数据就用了3个字节, 少的字节会自动补上空格符号。
varchar(M) 变长字符 M: [0, 65536] 比如定义了 varchar(5), 实际存储的时候会占用实际数据使用的字节数, 如果数据就使用了3个字节,则只占用3个字节的内容, 但是会在最后加上一个空格
tinyText
text // 可以看做是更大的varchar
mediumtext
longtext
enum 1或者2个字节 ,最多65536个值
Set 1,2,3,4,或者8个字节

char 和 varchar的比较,char比varchar更加耗费空间,但是因为定长,在处理速度上快一点。 如果一个VARCHAR列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR 代替 VARCHAR会更好一些。
char适用于 较短的字符固定长度的字符,以及某一列经常被改变字符长度
char 与varchar的实际存储:
02

mysql 的 innodb 存储引擎 建意使用varchar 类型这是因为对于InnoDB表,因为它的数据行内部存储格式对固定长度的数据行和可变长度的数据行不加区分(所有数据行共用一个表头部分,这个标头部分存放着指向各有关数据列的指针),所以使用char类型不见得会比使用varchar类型好。事实上,因为char类型通常要比varchar类型占用更多的空间,所以从减少空间占用量和减少磁盘i/o的角度,使用varchar类型反而更有利。

在MySQL中用来判断是否需要进行对据列类型转换的规则
  1、在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.
  2、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.
  3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.
例外:长度小于4个字符的char数据列不会被转换为varchar类型

varchar他既然可以自动适应存储空间,那我varchar(8)和varchar(255)存储应该都是一样的,那每次表设计的时候往大的方向去好了,免得以后不够用麻烦。这个思路对吗?答案是否定的。mysql会把表信息放到内存中(查询第一次后,就缓存住了,linux下很明显,但windows下似乎没有,不知道为啥),这时内存的申请是按照固定长度来的,如果varchar很大就会有问题。所以还是应该按需索取。

BINARY和VARBINARY类型(2) 类似于char 与varchar 只不过是存储的二进制串
bin 存储二进制
BLOB 和Text 是对应的, 不过存储的是二进制大对象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章