Schema的优化和索引 - 选择最佳的数据类型 - 字符串类型
2009-09-02 00:00:00 来源:WEB开发网如果我们保存相同的值到VARCHAR(10)的列。结果如下
mysql> SELECT CONCAT("'", varchar_col, "'") FROM varchar_test;
+-------------------------------+
| CONCAT("'", varchar_col, "'") |
+-------------------------------+
| 'string1' |
| ' string2' |
| 'string3 ' |
+-------------------------------+
数据的存储方式取决于存储引擎。每个存储引擎处理定长和变长并不是使用相同的方法。内存存储引擎使用的定长的行。因此它为每个值分配尽可能大的空间。即使这个字段是变长的也是如此。然而,附加和去除空格的行为时跨越存储引擎的。因为这是由MySQL自身来操作的。
CHAR和VARCHAR的兄弟类型是BINARY和VARBINARY.它们存储了二进制字符串。二进制字符串和传统字符串非常相似。但是他们存储字节而不是字符。附加也是不同的:MySQL给 BINARY值附加了\0而取代了空格。获取数据的时候也不会去掉它。
当你需要存储二进制数据以及希望MySQL把值作为字节去比较而不是字符的时候,这些类型是比较有用的。比较字符宽度的优势不仅仅是不区分大小写。MySQL逐个的比较二进制字符串的一个字节。比较依据就是每个字节的数值。作为结果来说,二进制比较 比 字符比较 简单的多。因此它们的速度更快。
BLOB和TEXT
BLOB和TEXT是为了分别存储超大的二进制数据和字符串。事实上,它们还有一些其他的属于同一种类的数据类型,如TINYTEXT,SMALLTEXT,TEXT,MEDIUMTEXT,以及LONGTEXT,以及二进制类型是TINYBOLB,SMALLBLOB,BLOB,MEDIUMBLOB和LONGBLOB.要注意的是BLOB就是SMALLBLOB,TEXT是SMALLTEXT.
不像其他的数据类型,MySQL用自身标识把每个BLOB和TEXT作为一个对象来处理。存储引擎专门的存储它们。当它们太大的时候,InnoDB会使用一个独立外部的存储区域来保存它们。一行中的每个值都需要1-4个字节的存储空间以及真正保存它们的地方实际上是外部的存储空间。
这两个类型唯一的区别就是,BLOB保存的二进制数据并没有校对规则或字符集,而TEXT保存的是字符串并有一个校对规则和字符集。
MySQL对BLOB和TEXT排序和其他类型有所不同:并不是对全长的String进行排序,而是根据列的max_sort_length字节来排序。如果你需要前几个字符进行排序。你可以降低max_sort_length 变量或者使用ORDER BY SUBSTRING(Column,length)
更多精彩
赞助商链接