MySQL表设计优化与索引 (五)

当存储一个CHAR值时, Mysql会除去尾随空间, 这个行为有点让人困惑, 用一个具体的例子来看一下: 首先 ,创建一个只有一个CHAR(10)字段的表并存储一些值在里面:

mysql> CREATE TABLE char_test( char_col CHAR(10));

mysql> INSERT INTO char_test(char_col) VALUES

-> (’string1′), (‘ string2′), (’string3 ‘);

然后检索这些值, 尾部空间被除掉了:

mysql> SELECT CONCAT(“‘”, char_col, “‘”) FROM char_test;

+—————————-+

| CONCAT(“‘”, char_col, “‘”) |

+—————————-+

| ’string1′ |

| ‘ string2′ |

| ’string3′ |

+—————————-+

如果存储同样的值在VARCHA(10)的字段里, 在检索的时候得到的结果如下:

mysql> SELECT CONCAT(“‘”, varchar_col, “‘”) FROM varchar_test;

+——————————-+

| CONCAT(“‘”, varchar_col, “‘”) |

+——————————-+

| ’string1′ |

| ‘ string2′ |

| ’string3 ‘ |

+——————————-+

数据的存储是存储引擎相关的, 并不是所有的存储引擎用同样的方式来处理定长和变长类型。Memory存储引擎使用定长的行, 因而它分配尽可能多的空间给变长字段来存储数据。 而Falcon则使用变长字段来存储, 即使对于CHAR字段也是如此。 但是填充和去尾是一致de 这是因为这个是 油MySql服务器自己处理的。

CHAR和VCHAR的兄弟类型分别是存储二进制数据的BINARY和VARBINARY, 二进制字符串与普通的字符长相似, 不过他们是以字节存储的, 而不是字符,填充也不一样 , Mysql用\0(0 字节)而不是空格填充二进制数据, 而在检索时不会把后面的填充值去掉。

对于需要存数二进制数据的活着需要Mysql对值进行字节的比较而不是基于字符的比较时, 二进制数据类型非常哟用。基于字节的比较的优势不只是大小写不敏感的好处, Mysql在比较二进制数据时, 通过字节表示的数值比较的方式进行的, 因为二进制数据相对与基于字符的比较更简单, 也更快。

记住长度单位是字符, 而不是字节, 一个多字节字符集要多个字节来存储。