Mysql常用数据类型
VARCHAR与CHAR字符型数据的差异
char(n)
和varchar(n)
中括号中n代表字符
的个数,并不代表字节
个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m3个字节,m∗3<=255,m∗3<=65535。使用 utf8mb4的话插入m个中文,会占用m4个字节。m∗4<=255,m∗4<=65535。-- 同时char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间,而varchar只会占用实际字符应该占用的字节空间L+1(L=0到255)或L+2(L>255),并且实际字节空间L+1<=255,或者L+2<=65535.
- 超过char和varchar的n设置后,字符串会被截断。
- char的上限为255字节,varchar的上限65535字节,text的上限为65535字节。(65535是在5.7版本才调整的,以前旧版本很小)
- CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。
- char在存储的时候会截断尾部的空格,varchar和text不会。
- char在存储的时候会将右侧空格进行剔除,保留左侧空格。
- varchar在存储的时候保留所有空格,不进行任何删除
- varchar和char在查询的时候都只会根据
where
条件中的左侧空格进行判断,右侧末尾的空格会忽略
- varchar(M),M范围是0~65535.M的值以最大行大小(65535字节)为准.例如,如果使用UTF-8编码,一个字符占3个字节,那么M最大为21844.
VARCHAR与CHAR 使用建议
-
根据字符的长度来判断,是考虑其长度的是否相近来确定选择char还是varchar,如何字段的长度基本都是一样或者其长度总是近似的可以选用char
-
即使使用Varchar数据类型,也不能够太过于慷慨!
比如你只使用到90个字符,VARCHAR(100)与VARCHAR(200)真的相同吗?结果是否定的。虽然他们用来存储90个字符的数据,其存储空间相同。但是对于内存的消耗是不同的。 -
VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。
- 这个长度只是“系统长度”,这并不意味着你真的可以完全利用65536字节来存储数据,因为varchar是不定长的,所以需要前两个字节标记字段的实际长度,结尾还要用一个字节表示结束.
-
VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。
-
VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。
-
varchar存储变长数据,但存储效率没有CHAR高。
-
如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。
-
从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。
-
效率来说基本是char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char
TEXT、BlOB类型的区别
-
BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有65535字节的最大限制;TEXT则不需要。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。
-
一个BLOB是一个能保存可变数量的数据的二进制的大对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同。
-
BLOB 可以储存图片,TEXT不行,TEXT只能储存纯文本文件。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于4个BLOB类型,并且有同样的最大长度和存储需求。在BLOB和TEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,而对TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。
int,bigint,smallint,tinyint类型的区别
-
int(n)
这个n代表的是数字显示的宽度
,不代表实际存储空间大小,实际存储空间大小是固定的,它在数据库里面存储的都是4个字节的长度,也就是 32 位.- int(3)、int(4)、int(8),int(11) 在磁盘上都是占用 4 btyes 的存储空间
- 对于无符号整形 (UNSIGNED ),可以存储
2^32 =4,294,967,296
大小的数据,宽度为10,即int(10) - 对于有符号整型,范围是 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) ,注意看最小值,宽度为11,即int(11)
-
tinyint
- 从 0 到 255 的整型数据。存储大小为 1 字节
-
smallint
- 从 -2^15 (-32,768) 到 2^15 – 1 (32,767) 的整型数据。存储大小为 2 个字节。
-
在 MySQL 8.0 及以上的版本, AUTO_INCREMENT 列会自动添加一个隐式的 UNSIGNED 属性来保证插入的值非负。