varchar 和 char 是两种最主要的字符串类型 。不幸的是,很难精确地解释这些值是怎么 存储在磁盘和内存中的,因为这眼存储引擎的具体实现有关 。下面的描述假设使用的存 储引擎是 innodb 和 /或者my isam。如果使用的不是这两种存储引擎 ,请参考所使用 的存储引擎的文档。
先看看 varc har 和 c ha r 值通常在磁盘上怎么存储 。请注意,存储引擎存储 cha r 或者 varc har 值的方式在 内存中和在磁盘上可能不一样 ,所以mysql 服务器从存储引擎读 出的值可能需要转换为另一种存储格式。下面是关于两种类型的一些比较。
varchar类型用于存储可变长字符串,是最常见的字符串数据类型。它比定长类型
更节省空间,因为它仅使用必要的空间(例如,越短的字符串使用越少的空间)。有一种情况例外,如果mysql表使用row_format=fixed创建的话,每一行都会使用定长存储,这会很浪费空间。
varchar需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。假设采用latinl字符集 ,一个varc陆r(10)的列需要11个字节的存储空间。varc陆r(1000)的列则需要1002个字节,因为需要2个字节存储长度信息。
varchar节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在update时可能使行变得比原来更长,这就导致需要做额外的工作。如果一个行占用 的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,不同的存储引擎的处理方式是不一样的。例如,myisam会将行拆成不同的片段存储,innodb 则需要分裂页来使行可以放进页内。其他一些存储引擎也许从不在原数据位置更新数据。
下面这些情况下使用varchar是合适的:字符串列的最大长度比平均长度大很多$列的更新很少,所以碎片不是问题p使用了像utf-8这样复杂的字符集,每个字符 都使用不同的字节数进行存储。
在5.0或者更高版本,mysql在存储和检索时会保留末尾空格。但在4.1或更老的版本,mysql会剔除末尾空格。
innodb则更灵活,它可以把过长的varc陆r存储为blob,我们稍后讨论这个问题。
char
char类型是定长的:mysql总是根据定义的字符串长度分配足够的空间。当存char值时,mysql会删除所有的末尾空格(在mysql4.1和更老版本中varcha也是这样实现的一一也就是说这些版本中char和varchar在逻辑上是一样的,别只是在存储格式上)。c陆r值会根据需要采用空格进行填充以方便比较。
char适合存储很短的字符串,或者所有值都接近同一个长度。例如,char非常适合存储密码的问05值,因为这是一个定长的值。对于经常变更的数据,char也比varchar更好,因为定长的char类型不容易产生碎片。对于非常短的列,charvarchar在存储空间上也更有效率。例如用char(l)来存储只有y和n的值,如采用单字节字符集注5只需要一个字节,但是varc陆r(l)却需要两个字节,因为还一个记录长度的额外字节。
char 类型的这些行为可能有一点难以理解,下面通过一个具体的例子来说明。首先,我 们创建一张只有一个 c阳刚10) 字段的表井且往里面插入一些值 :

当检索这些值的时候,会发现 string3 末尾的空格被截断了。
如果用 varchar(10) 字段存储相同的值,可以得到如下结果:
数据如何存储取决于存储引擎 ,并非所有的存储引擎都会按照相同的方式处理定长和 变长的字符串 。memory 引擎只支持定长的行 ,即使有变长字段也会根据最大长度分
配最大空间。不过,填充和截取空格的行为在不同存储引擎都是一样的 ,因为这是在mysql 服务器层进行处理的 。
与 char 和 varchar 类似的类型还有 binary 和 varbinary ,它们存储的是二进制字符串 。 二进制字符串眼常规字符串非常相似 ,但是二进制字符南存储的是字节码而不是字符 。 填充也不一样 :mysql 填充 binary 采用的是\0 ( 零字节) 而不是空格 ,在检索时也不 会去掉填充值剧。
当需要存储二进制数据 ,井且希望 mysql 使用字节码而不是字符进行比较时 ,这些 类型是非常有用的 。二进制比较的优势并不仅仅体现在大小写敏感上 。mysql 比较 binary 字符串时 ,每次按一个字节 ,并且根据该字节的数值进行比较 。因此,二进制比 较比字符比较简单很多 ,所以也就更快。
特别说明:尊重作者的劳动成果,转载请注明出处哦~~~http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt337