MySQL表设计优化与索引 (五)
时间:2010-10-22 来源:lan9203
当存储一个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在比较二进制数据时, 通过字节表示的数值比较的方式进行的, 因为二进制数据相对与基于字符的比较更简单, 也更快。
记住长度单位是字符, 而不是字节, 一个多字节字符集要多个字节来存储。