char & varchar Text Blob

char(M)

在MYSQL中,字段类型char是指 使用指定长度的固定长度表示的字符串;

比如char(8),

√  则数据库会使用固定的8个字节来存储数据 ,不足8位的字符串在其后补空字符;所支持的最大长度是255个字符

它的空间利用率有可能等于100%,比如char(8)这个字段,我们全部用来存8字节的字符。空间就全部利用起来了。

char型,如果不够M个字符,内部用空格补齐,取出时再把右侧空格删掉

Char(M)如何占据M个字符宽度?

答: 如果实际存储内容不足M个,则后面加空格补齐.

√  取出来的时候, 再把后面的空格去掉.(所以,如果内容最后有空格,将会被清除).

注意: char(M),varchar(M)限制的是字符,不是字节.

即 char(2) charset utf8, 能存2个utf8字符. 比如'中国'


varchar(M) 

其中M代表该数据类型所允许保存的字符串的最大长度,只要长度小于该最大值的字符串都可以被保存在该数据类型中。

因此,对于那些难以估计确切长度的数据对象来说,使用varchar数据类型更加明智。

√  varchar数据类型所支持的最大长度65535。PS:

mysql varchar(50)  不管中文 还是英文 都是存50个的 

MySQL5的文档,其中对varchar字段类型这样描述:varchar(m) 变长字符串。M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,最大有效长度是65,532字节)。

为何会这般变换?真是感觉MySQL的手册做的太不友好了,因为你要仔细的继续往下读才会发现这段描述:MySQL 5.1遵从标准SQL规范,并且不删除VARCHAR值的尾部空格。VARCHAR保存时用一个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度大于255,长度前缀是两个字节。

好了,貌似懂了一点。但具体他说的长度大于255时使用2个字节长度前缀,小学减法题:65535 - 2 = 65533啊。不知道这些大牛如何计算的,暂且保留疑问吧?

注:我测试了一下使用UTF8编码,varchar的最大长度为21854字节。

在mysql 5.0.45版本,数据库编码utf8下进行测试:varchar最长定义为21785。也就是说不论字母、数字、汉字,只能放21785个。
推想:varchar字节最大65535,utf8编码一个字符3个字节65535/3=21785。

char 执行效率高,
Varchar 对于变长的字符串来说,更节约空间。

Text : 文本类型,可以存比较大的文本段,搜索速度稍慢.

因此,如果不是特别大的内容,建议用char,varchar来代替.

√  Text 不用加默认值 (加了也没用).

Blob,是二进制类型,用来存储图像,音频等二进制信息.

意义: 2进制,0-255都有可能出现.

√  Blob在于防止因为字符集的问题,导致信息丢失.

比如:一张图片中有0xFF字节, 这个在ascii字符集认为非法,在入库的时候,被过滤了.

myisam 存储引擎 建议使用固定长度,数据列代替可变长度的数据列。 
memory存储引擎 目前都使用固定数据行存储,因此无论使用char varchar列都没关系, 
innodb 存储引擎 建意使用varchar 类型

原文地址:https://www.cnblogs.com/zy2012/p/2847134.html