int(n),tinyint(n)n的含义
Tinyint(n):此处的n仅仅与显示有关,和底层存储实际占用空间大小无关
tinyint(1) 这里的1表示的是 最短显示一个字符。tinyint(2) 这里的2表示的是 最短显示两个字符,但这里光设置m是没有意义,你还需要指定当数据少于长度m时用什么来填充,比如zerofill(表示有0填充)。设置tinyint(2) zerofill 你插入1时他会显示01。设置tinyint(4) zerofill 你插入1时他会显示0001。
tinyint占一个字节,有符号的范围是-128 - 127,无符号的范围是 从 0 到 255 的整型数据。int占4个字节。
int(n)中的n和tinyint(n)中n的含义完全一样。
char(N)与varchar(N)中n含义
char(N)和varchar(N)最大的区别在于存储需求空间上的区别上,前者为固定长度,存储需求为N字符长度,如果长度小于n,则用空格补齐,varchar为可变长度(“var”意为“variable”,可变的),存储需求为实际值的长度+1(如果N>255,则+2)。
其中N,不管针对char还是varcahr均有最大字符长度不允许超过N的意思,超过部分则会被截掉不要。如将sql mode设置为TRADITIONAL模式,数据超过长度n是无法插入的,会在插入的时候报错
mysql> set @@sql_mode=TRADITIONAL;
char(N)的N取值范围为255。
mysql> create table t3 (c char(350),v varchar(5));
ERROR 1074 (42000): Column length too big for column 'c' (max = 255); use BLOB or TEXT instead
varchar(N)的N取值范围逻辑如下:
4.0版本以下,varchar(50),指的是50字节,如果存放UTF8汉字时,只能存16个(每个中文3字节)
5.0版本以上,varchar(50),指的是50字符,无论存放的是数字、字母还是UTF8中文(每个中文3字节),都可以存放50个
N取值范围为65535,超过了自动转换为text类型被强转成text类型
3、varchar(50)和varchar(100)是否一样?
硬盘存储需求一样,内存需求不一样。即对于VARCHAR数据类型来说,硬盘上的存储空间是根据实际字符长度来分配存储空间的,而对于内存来说,是使用N个字符空间的内存块来保存值,即varchar(50)占用50个字符内存空间,varchar(100)占用100个字符内存空间。
decimal
DECIMAL(P,D)表示列可以存储D位小数的P位数;即D是小数位数,P是总位数,整数位数=P-D